Ответы пользователя по тегу PHP
  • Dompdf кириллица вся в вопросах почему?

    GeneMoss
    @GeneMoss
    void
    Шрифт не поддерживает юникод или кириллицу. Скачайте другой шрифт, с гарантированной поддержкой юникода и кириллицы.
    Ответ написан
  • Можно ли вызвать приватный метод внутри анонимной функции?

    GeneMoss
    @GeneMoss
    void
    Нужно связать Ваше замыкание с нужным объектом:
    $class = new Klass;
    $closure = function($someValue) use($amount) {
        return $this->test($amount, $someValue);
    };
    $closure = $closure->bindTo($class, 'Klass');
    $class->check($data, $closure);
    Ответ написан
    Комментировать
  • Как в PHP получить объект по пути из переменной?

    GeneMoss
    @GeneMoss
    void
    $object = new Object; // Инициализация объекта, который содержит property «a»
    
    $path = 'a->b->c';
    $properties = explode('->', $path);
    
    $getProperty = function($obj, $property) {
        // Тут какие-нибудь проверки на существование, на instanceof и т. п.
        return $obj->$property;
    };
    
    $result = array_reduce($properties, $getProperty, $object);
    
    // $result -- это последний property в цепочке, т.е. -- «c»


    UPD: Как я понял, автор хочет хранить пути доступа к узлам в XML-файле. Для этого проще использовать xpath и хранить строки вида '/a/b/c'.
    $xml = new SimpleXMLElement('<xml><a><b><c>test</c></b></a></xml>');
    $result = $xml->xpath('//a/b/c');
    Ответ написан
    1 комментарий
  • Годный ли обработчик формы?

    GeneMoss
    @GeneMoss
    void
    Не делайте такие длинные методы. Не копипасте. Отделяйте построение запроса от данных. И не надо все делать static.

    public static function saveStaff($options) 
    {
        if (self::isValidStaff($options)) {
            $staffFields = self::getFilledStaffFileds($options);
            $qb = new QueryBuilder( Db::getConnection() );
            $qb->where('id = 1')->update('staff', $staffFields);
        }
    }
    
    public static function getFilledStaffFileds($options)
    {
        $staff = [];
        if ($options['director_surname']) {
            $staff['surname'] = $options['director_surname'];
        }
        if ($options['director_surname']) {
            $staff['name'] = $options['director_name'];
        }
        if ($options['director_surname']) {
            $staff['ot4'] = $options['director_ot4'];
        }
        if ($options['director_surname']) {
            $staff['oklad'] = $options['director_oklad'];
        }
        if ($options['director_surname']) {
            $staff['date_start'] = $options['director_date_start'];
        }
    
        return $staff;
    }
    
    function static function isValidStaff($options)
    {
      return isset($options['surname']) 
        || isset($options['name'])
        || isset($options['ot4']) 
        || isset($options['oklad'])
        || isset($options['date_start']);
    }


    И использовать какой-нибудь построитель запросов, типа такого:
    class QueryBuilder {
        protected $db;
        protected $where = '';
        
        public function __construct($db) {
            $this->db = $db;
        }
        
        public function where($where)
        {
            $this->where = trim($where);
            return $this;
        }
        
        public function update($table, $params)
        {
            $values = [];
            foreach ($params as $key => $value) {
                $values[] = "`{$key}` = :{$key}";
            }
            
            $sql = 'UPDATE `' . $table . '` SET ' . join(', ', $values);
            if ($this->where) {
                $sql .= ' WHERE ' . $this->where;
            }
    
            $result = $this->db->prepare($sql);
            foreach ($params as $key => $value) {
                $result->bindParam(':' . $key, $value, PDO::PARAM_STR);
            }
            return $result->execute();
        }
    }

    P. S. Лучше пользоваться готовыми компонентами.
    P. P. S. Наверняка есть опечатки, набирал без IDE.
    Ответ написан
    Комментировать
  • Как обернуть в ссылку хештег?

    GeneMoss
    @GeneMoss
    void
    $string = '#небо #море';
    echo preg_replace('/#([a-zа-я0-9]+)/ui', '<a href="tag/$1">#$1</a>', $string);
    Ответ написан
    2 комментария
  • В чём преимущество автозагрузчика классов?

    GeneMoss
    @GeneMoss
    void
    А можно избавиться от строки $obj = new MyClass(); и создавать экземпляр автоматически в момент $obj->displayVar();?
    Естественно заранее не создавая "впрозапас" по экземпляру каждого класса.

    Не совсем четкое требование, но по описанию похоже на синглтон. Т.е. вызывать вот так:
    MyClass::getInstance()->displayVar();
    MyClass::getInstance()->foo();
    MyClass::getInstance()->bar();

    Объект создастся в момент первого вызова.

    В классе реализовать вот так:
    class MyClass {
      protected static $instance = null;
      
      protected __construct() { }
    
      public static function getInstance() {
        if (is_null($this->instance)) {
          self::$instance = new self();
        }
        return self::$instance;
      }
    }
    Ответ написан
  • Как проверить строчку на наличие нескольких цифр подряд?

    GeneMoss
    @GeneMoss
    void
    Идея, конечно, у Вас так себе. Но сделать это можно так:
    $tel = filter_input(INPUT_POST, 'tel');
    $spam = ! preg_match('/[0-9]{2}/', $tel);

    /[0-9]{2}/ — это называется регулярным выражением. Обозначает: [0-9] — любя цифра, {2} — повторяется 2 раза. Вместо [0-9] можно указать эскейп-последовательность \d — которая обозначает любая цифра. Можно написать \d\d — будет искать две любые цифры.
    Ответ написан
  • Как поменять тип документа в браузере?

    GeneMoss
    @GeneMoss
    void
    У Вас все нормально. Ошибки никакой нет. Хром всего лишь говорит, что нет соответствующих стилей (xslt) для преобразования XML в читабельный вид и что Вы видите голые данные, именно те, которые Вам и нужны.
    Ответ написан
    1 комментарий
  • При чтение каталога возвращается единица?

    GeneMoss
    @GeneMoss
    void
    foreach (new DirectoryIterator('./') as $file) {
        if ($file->isDot()) {
            continue;
        }
        echo $file->getFilename() . "<br>";
    }
    Ответ написан
    Комментировать
  • Как практиковаться в чтении чужого кода?

    GeneMoss
    @GeneMoss
    void
    Скажите, что прочитаете тесты, которые покрывают этот код и комментарии к нему. Если Вам ответят, что этого ничего нет, то и Вам там делать нечего.

    UPD: Попрактиковаться в чтении кода Вы можете, например, на чтении исходного кода фреймворка, что Вам нравится.
    Ответ написан
    Комментировать
  • Как добавить в БД огромный массив?

    GeneMoss
    @GeneMoss
    void
    Вариант 1.
    1. Сгенерировать один большой SQL-запрос.
    2. Выполнить запрос.

    Вариант 2.
    1. Сгенерировать SQL-файл.
    2. Загрузить файл с помощью консоли и команды mysql.

    Вариант 3.
    1. Сгенерировать csv-файл.
    2. Загрузить csv через LOAD DATA INFILE.
    Ответ написан
    4 комментария
  • Почему выдаёт ошибку только через bat - Fatal error: Call to undefined function curl_init()?

    GeneMoss
    @GeneMoss
    void
    В консоли выполните: php --ini и отредактируйте тот файл, что выдаст.
    Ответ написан
  • Как с помощью php читать из файла txt только вторую строку?

    GeneMoss
    @GeneMoss
    void
    Лучше всего использовать для этого следующий метод:
    $file = new SplFileObject('events/kp1/dungeon1.txt');
    $file->seek(1); // переходим ко второй строке (нумерация с нуля)
    echo $file->current();
    Ответ написан
    Комментировать
  • Как получить название шрифта из файла шрифта с помощью php или javascript?

    GeneMoss
    @GeneMoss
    void
    Для PHP можно воспользоваться библиотекой https://github.com/PhenX/php-font-lib — она это умеет.
    Ответ написан
    Комментировать
  • Выдернуть из строчки адреса, как?

    GeneMoss
    @GeneMoss
    void
    $str = 'case:s:webima:http://pk.ve.someurl.com:80/demo,on1_hhh_5@s36016,mob:webima:http://pk.ve.someurl.com:80/demo,t_k275292400,pr:webima:http://pk.ve.someurl.com:80/demo,on0_SHM_12@s36018,default:webima:http://pk.ve.someurl.com:80/demo,5554897363a';
    
    preg_match_all('/http:[^,]*,[^,]*/', $str, $matches);
    
    print_r($matches[0]);


    Краткое описание регулярного выражения:
    http:[^,]*,[^,]*

    1. http: — ищем шаблон, который бы начинался с «http:».
    2. [^,]* — ищем последовательность символов, в которой отсутствует запятая. Квадратные скобочки — это синтаксис определения возможных символов, из которых может состоять последовательность. Например [abc] — это шаблон одного символа, который совпадает с только с одной из букв «a», «b» или «c». Крышечка «^» — отрицание присутствия перечисленных символов. Звездочка «*» обозначает повторяемость этого символа от 0 до бесконечного числа раз.
    3. , — просто ищем запятую.
    4. [^,]* — см. п. 2. Т.е. в конце должна идти последовательность, которая не содержит запятые.

    Таким образом, шаблон читать так:
    (http:)(любые символы, кроме запятой)(,)(любые символы, кроме запятой)
    Ответ написан
    1 комментарий
  • Создание вероятности на php. Можете помочь?

    GeneMoss
    @GeneMoss
    void
    /**
     * Случайная выборка с учетом веса каждого элемента.
     * @param array $data Массив, в котором ищется случайный элемент
     * @param string $column Параметр массива, содержащий «вес» вероятности
     * @return int Индекс найденного элемента в массиве $data 
     */
    function getRandomIndex($data, $column = 'ver') {
      $rand = mt_rand(1, array_sum(array_column($data, $column)));
      $cur = $prev = 0;
      for ($i = 0, $count = count($data); $i < $count; ++$i) {
        $prev += $i != 0 ? $data[$i-1][$column] : 0;
        $cur += $data[$i][$column];
        if ($rand > $prev && $rand <= $cur) {
          return $i;
        }
      }
      return -1;
    }
    
    // Использование
    $games = [
    	['name' => 'Игра 1', 'ver' => 2], // вероятность 2/15
    	['name' => 'Игра 2', 'ver' => 0], // вероятность 0/15
    	['name' => 'Игра 3', 'ver' => 1], // вероятность 1/15
    	['name' => 'Игра 4', 'ver' => 4], // вероятность 4/15
    	['name' => 'Игра 5', 'ver' => 8], // вероятность 8/15
    ];
    $i = getRandomIndex($games);
    echo $games[$i]['name'];

    В параметре массива «ver» задается вероятность выпадения данного элемента таким образом, что вероятность выпадения каждого элемента равна ver/sum, где sum — сумма вероятностей в данном массиве (в примере это: 2 + 0 + 1 + 4 + 8 = 15).

    После миллиона испытаний получено следующее количество выпадений:
    • Игра 1 = 13.3958%
    • Игра 2 = 0%
    • Игра 3 = 6.671%
    • Игра 4 = 26.6124%
    • Игра 5 = 53.3208%

    Что до сотой доли процента совпадает с заданной вероятностью в параметре «ver».

    P. S. Суть алгоритма — имитация случайной выборки из массива, который заполнен элементами, которые дублируются с заданной частотой.
    Ответ написан
    Комментировать
  • Текст не переходит на новую строку?

    GeneMoss
    @GeneMoss
    void
    В HTML для расстановки переносов используется тег <br>, который ставится на месте предполагаемого переноса на новую строку. Расставить эти теги поможет PHP-функция nl2br(), которая дополнит переход на новую строку тегом <br>.
    php.net/manual/ru/function.nl2br.php
    Ответ написан
    1 комментарий
  • PHP добавляем строки в таблицу MySQL?

    GeneMoss
    @GeneMoss
    void
    Имя таблицы должно быть в кавычках вида ` (обратный апостроф), а не '.
    INSERT INTO `vacancies` VALUES ...
    Ответ написан
    Комментировать
  • Как вывести определенное количество картинок из папки?

    GeneMoss
    @GeneMoss
    void
    $maxNumber = 10; // Максимальное количество изображений
    $validExtensions = array('jpg', 'jpeg', 'png', 'gif'); // Допустимые расширения
    $path = 'images/gallery/'; // Директория с картинками
    
    $dir = new DirectoryIterator($path);
    foreach ($dir as $file) {
        if (!$file->isDot() && in_array($file->getExtension(), $validExtensions)) {
            echo "<img src='{$path}{$file->getFilename()}' alt=''>";
            if (--$maxNumber == 0) {
                break;
            }
        }
    }
    Ответ написан
    1 комментарий
  • Необъявленные переменные по умолчанию в php?

    GeneMoss
    @GeneMoss
    void
    $user_id = filter_input(INPUT_POST, 'user_id', FILTER_VALIDATE_INT);

    Если user_id передан и является целым числом, тогда $user_id будет содержать это число.
    Если user_id передан и не является числом, тогда $user_id будет содержать false.
    Если user_id не передан, тогда $user_id будет содержать null.

    Подробнее: www.php.net/manual/ru/function.filter-input.php
    Ответ написан
    Комментировать