Задать вопрос
Ответы пользователя по тегу PHP
  • Почему массив не меняется в цикле foreach?

    https://www.php.net/manual/ru/migration70.incompat... :
    foreach по значениям оперирует копией массива
    Если foreach используется для стандартного перебора по значению, то он оперирует копией массива, а не самим массивом. Это значит, что изменения внесённые в массив внутри цикла не затронут перебираемые значения.
    Ответ написан
  • Как запустить дебаг php скрипта, находящегося на удаленной машине, где php установлен в docker?

    имхо, ключевой момент - это "машина удалённая".
    Как работает интеграция xdebug в IDE:
    1) IDE начинает слушать определённый порт,
    2) порт (и, при необходимости, хост) передаются в параметры xdebug
    3) скрипт стартует, и xdebug подключается к порту.

    Соответственно, если удалённая машина не может достучаться до порта (и неважно, xdebug или что-то ещё) - у вас проблема.
    Мне docker добавил ещё такую проблему: если в docker-compose указывать биндинг порта, то это означает ,что это докер слушает порт. Значит, порт занят и задействовать его, например, в ssh туннеле не получится.
    К сожалению, я это исследование до конца не довёл
    Ответ написан
    Комментировать
  • Как убрать ошибку php которая возникла при обновлении копии битрикса?

    проверьте страницу установки обновлений, не пропущено ли что-то? Этот метод точно есть в модуле main версии 26.0.0 ( возможно, даже в версии 25.700.0 уже был).
    Если там всё чисто - пишите в техподдержку. Если обновления установились криво, кто знает, что ещё там сломалось.
    Ответ написан
    Комментировать
  • Как получить 3 массива из одного запроса?

    да, правильно мыслите - в цикле, который будет построчно обрабатывать $result, проверяете и добавляете в нужный массив:
    while ($row = $result->fetch_assoc()) {
        switch( $row['status'] ) {
             // тут кейсы
        }
    }

    Когда заработает, подумайте вот о чем:
    1) зачем вам такие длинные и неинформативные имена вроде $user_status_0_array? То, что это массив, подскажет IDE.
    2) нужно ли тут три массива, или лучше использовать один многоуровневый?
    $users = [
       0 => ["name1", "name6", "name9"],
       1 => ["name2", "name5", "name6"],
       2 => ["name7", "name8", "name3"],
    ];
    Ответ написан
    Комментировать
  • Как отдать ответ клиенту без ожидания завершения скрипта?

    очереди. После ответа клиенту ставите задание в очередь. Воркер забирает задание, делает запрос на другой сервис и всё остальное. Это не так сложно, как может показаться.
    Ответ написан
    Комментировать
  • Как оптимально подтягивать og:img для списка статей с разных сайтов?

    Думаю, сохранять картинку сниппета при создании элемента

    Разумное решение. Или можно ставить задание в очередь. Ещё можно в фоне периодически актуализировать.
    Ответ написан
    Комментировать
  • Почему некорректно форматируются PHP с HTML, когда открывающие/закрывающие теги в условиях?

    если хочется без шаблонизаторов, то пишите так:
    <?php 
    ob_start();
    echo 'content';
    $content = ob_get_clean();
    
    if (true) {
        ?><div class="hidden"><?=$content?></div><?php
    } else {
        echo $content;
    }

    и будет Вам счастье. Разрывы во вложенности никто не любит - ни PHP контекст, ни HTML контекст.

    P.S. вспоминаю времена XSLT - боже, как это было офигенно!
    Ответ написан
    Комментировать
  • Почему array_count_values возвращает пустой массив?

    Какой-то странный код, смотрите сами:
    $value = 'townhouse';
    - это следует из сообщения об ошибке (кстати, нафига вы сообщение об ошибке вклеили картинкой? Чтобы красным подчеркнуть? Это не несёт никакой пользы).
    Значит, $object_types - это массив, элементы которого - тоже массивы с ключом 'townhouse', либо объекты со свойством 'townhouse' (не значением свойства).
    array_column($object_types, $value) вернёт список значений по этому ключу.
    А array_count_values() сгруппирует одинаковые значения и посчитает.
    Очень странно выглядит, если в элементах $object_types ключ 'townhouse' содержит значение 'townhouse'.

    Покажите, что выводит код:
    $count = array_count_values(array_column($object_types, $value));
    var_dump($object_types, $value, $count);

    Если только там не простыня в километр..
    Ответ написан
  • Не понимаю какой php.ini загружается?

    Вы зачем-то расположение ini-файлов посмотрели через cli , а значения нужной директивы смотрите через веб.

    Посмотрите расположение ini-файлов тоже через веб - аналогичная таблица была наверху страницы, со строкой "Loaded Configuration File" и прочим
    Ответ написан
    Комментировать
  • Какой параметр php модуля отключает тему формы с сайта?

    Вангую, что письма Вы отправляете через Яндекс.Почту ( или получаете на неё). У Яндекс.Почты, похоже, раньше была такая фишка: они принимали темы письма в нестандартных кодировках. Но недавно это отвалилось.
    Кодируйте тему письма по стандарту, и будет Вам счастье.
    ( PHPMailer, например, умеет кодировать - можете подсмотреть в нём, как надо)
    Ответ написан
    Комментировать
  • Как подставить ссылку на источник при копировании текста?

    Вы неправильно осмыслили задачу, и получился франкенштейн. Одна задача - это вставка ссылки при событии oncopy. Это делается на чистом Javascript, абсолютно не требует PHP, и никакого отношения к WordPress не имеет. Можете эту часть спросить отдельно в хабе Javscript - хотя я подозреваю, что в интернете уже выложена куча решений.
    А вторая задача у Вас уже решена; я только использую хук на другое событие:
    add_action( 'wp_enqueue_scripts', function () {
        if ( !current_user_can( 'manage_options' ) ) {
            wp_enqueue_script('oncopy_addlink', '/path/to/script.js');
        }
    });
    Ответ написан
    3 комментария
  • Как в PHP создать свою глобальную функцию?

    Как в PHP создать свою функцию и использовать ее без объявления в файлах,

    Создать без объявления - разве что через написание своего расширения. Как функция print_r объявлена где-то в ядре PHP, так и Ваша будет. Но это чрезмерно сложный и неудобный путь; нужно компилировать расширение как минимум под разные ОС.
    Если речь о том, чтобы не вставлять тело функции в каждый файл, то это решается или за счёт единой точки входа, или за счёт единого бутлоадера, что ведёт либо к автозагрузке классов, либо старому доброму require_once.
    Не упопмянули разве что такой экзотичный механизм как auto-prepend-file - но для Вашей задачи, имхо, тут больше минусов, чем плюсов
    Ответ написан
    Комментировать
  • Как сделать чтобы проект удалил папку с самим собой и на её место скопировал другую папку?

    я бы немного изменил Ваше решение:
    1) PHP скрипт загружает архив во временную папку и распаковывает там.
    2) по окончанию распаковки скрипт текущую папку переименовывает, например, в project_old , а временную папку помещает по пути /home/user/project
    3) затем можно запустить шелл скрипт, который удалит /home/user/project_old

    Может быть проблема, если что-то держит открытый файловый дескриптор на /home/user/project
    Тогда можно так:
    1) первый шаг оставляем без измнений
    2) во временной папке запускаем шелл скрипт, который очистит /home/user/project и перекидает туда всё из временной папки
    3) затем из основной папки запускаем скрипт ( хоть шелл, хоть php-шный), который удалит временную папку.
    Ответ написан
    Комментировать
  • Как убрать вывод даты?

    вот это:
    if($date_end=='0000-00-00'){
    			$date_end = date('Y-m-d', strtotime('+1 year'));
    		}

    уберите, а там, где вывод этой даты, уже проверяйте. Вы же не показали кусок кода, в котором дата выводится - может, это совсем в другом месте происходит
    Ответ написан
    6 комментариев
  • Как из строки с путём получить элемент массива?

    <?php
    $string = "k1/k2/k3";
    $arr = [
    	'k1' => [
    		'k2' => [
    			'k3' => [
    				'k4' => 'v'
    				]
    			]
    		]
    ];
    
    $code = 'return $arr["'.str_replace('/', '"]["', $string).'"];';
    $result = eval($code);
    var_dump( $result );

    Конечно, eval() - зло. Но это зло ещё живое!
    Ответ написан
    6 комментариев
  • Как выполнить поиск данных, если в базе данных указан шаблон?

    хранится он в виде W1K253???1???????, W1N253???1???????

    Насколько я вижу, эти шаблоны одинаковы, то есть:
    1. 6 фиксированных символов
    2. 3 произвольных символа
    3. 1 фиксированный символ
    4. 7 произвольных символов

    При этом произвольные символы обозначены знаком "?".
    Тогда можно сделать такой регуляркой:
    <?php
    $requestedVin = 'W1K25312311234567';
    $pattern = preg_replace('/^([A-Z\d]{6})[A-Z\d]{3}([A-Z\d])[A-Z\d]{7}$/', '$1???$2???????', $requestedVin);
    
    $query = "
            SELECT DISTINCT p.ID
            FROM {$wpdb->posts} p
            INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product'
              AND p.post_status = 'publish'
              AND pm.meta_key = 'vin'
              AND pm.meta_value = %s
            LIMIT 10 OFFSET %d
        ";
    
    $results = $wpdb->get_col($wpdb->prepare($query, $pattern, $offset));
    Ответ написан
    Комментировать
  • Как сформировать список по вложенному массиву рекурсивной функцией?

    извращение с мухлежом:
    <?php
    function list_form(array $items):string
    {
         function inner(array $items):string {
            $result = '';
            foreach ($items as $key => $val) {
                if (is_array($val) ) {
                    $result .= "<li>$key =></li>";
    
                    if (!empty($val)) {
                        $result .= inner($val);
                    }
                } else {
                    $result .= "<li>$key => $val</li>";
                }
            }
            return $result;
        }
    
        return '<ul>'.inner($items).'</ul>';
    }
    echo list_form($arr);
    Ответ написан
    Комментировать
  • Что неправильного в моем коде?

    Как минимум, Вы не вникли в задачу. Я вот в футболе практически не разбираюсь - получив такое задание, я пошёл бы в гугл узнавать, как проводятся матчи в турнирах, когда команда играет на своём поле, а когда - нет. Даже по своим скудным знаниям могу кое-что предположить:
    1) Первый круг: команды надо разбить на пары случайным образом. Это shuffle() + array_chunk() . У Вас этого нет.
    1.1) Учесть ситуацию, когда команд - нечётное количество. Этого тоже нет.
    2) в парах какую-то команду назначить хозяином. Соответственно, в выводе в колонке "Хозяева" должно быть не повторение "Хозяева", "Хозяева", "Хозяева", а имена команд
    3) дальше надо смотреть, на каких условиях проводится второй круг, кто в него попадает, на своём поле играют или на чужом..

    Получается, из этого:
    загружать через форму файл json со списком команд, а потом сводить эти команды в турнируную таблицу с условиями (гость, хозяин), круг 1, круг 2 и еще 5-6 условий, которые влияют на список
    Вы выполнили только "загружать через форму файл json", причём зачем-то этот файл сохраняете на диск, а потом немедленно читаете обратно.

    Сергей Вам справедливо указал на "разделение обязанностей", то бишь первую букву в SOLID - Single Responsibility Principle. Даже если оставить на месте выверт с сохранением на диск, получается:
    1. Repository - хранилище данных
    2. метод контроллера, отвечающий за приём данных именно в виде сабмита формы и сохранение их Repository
    3. Генератор текущего круга
    4. View, который отвечает за генерацию html-разметки круга,
    5. метод контроллера, который может извлечь данные из Repository, скормить их генератору, получить результат и скормить его во View.


    И не факт, что методы из 2 и 5 пункта принадлежат одному классу.
    Ответ написан
    Комментировать
  • Для чего нужен wakeUp в Битрикс?

    если посмотреть код, то видно, что при wakeUp не выполняется никаких обращений к БД.
    Метод в файле bitrix/modules/main/lib/orm/objectify/entityobject.php
    смотрите разницу:
    fill*() - подгружает значение из БД
    set*() - задаёт значение свойства, но при несовпадении со старым значением переводит объект в состояние State::CHANGED
    wakeUp() -создаёт объект с указанными значениями свойств, не переводя объект в изменённое состояние, но только при условии, что в аргументе есть первичный ключ.
    Ответ написан
    Комментировать
  • Вставка изображений в png шаблон по параметрам Wordpress?

    Что-то вроде водяного знака, но только наоборот?

    Почему наоборот? Ровно так же, если я правильно Вас понял.
    Для водяного знака:
    1) берётся исходное изображение,
    2) берётся изображение с водяным знаком,
    3) второе накладывается поверх первого,
    4) результат сохраняется

    В вашем случае:
    0) пользователи отсылают форму с файлом фотографии и какими-то текстовыми полями (например, ФИО)
    1) берётся изображение-шаблон пустого бейджа,
    2) берётся изображение из присланной формы,
    3) второе накладывается поверх первого,
    4) также поверх пишется текст из текстовых полей,
    5) результат сохраняется.

    Это можно сделать средствами GD.
    Ответ написан
    Комментировать