Задать вопрос
Ответы пользователя по тегу PHP
  • API bot TG - Как мне узнать, на какой вопрос ответили?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    По-простому, костыльному, можно предполагать, что очередная реплика пользователя, которая не-команда типа /start (начать сначала) или какой-нибудь /edit (допустим, исправить последний ответ) – это ответ на следующий по порядку вопрос. В базе данных сохраняйте под id пользователя его ответы, заполняя каждый раз следующий пустой вопрос, например. Эт. совсем упрощенно-колхозно.

    Для адреса, наверное, можно предлагать не вводить название, а тыкнуть точку на карте — прислать location, как вариант.

    По-крутому, можно сделать нормальное веб-приложение, хороший интерфейс, форму с полями, валидацией и подсказками. См. WebApp в Telegram.
    Ответ написан
    Комментировать
  • Как в библиотеке Monolog 2.8 PHP ограничить отправку похожих писем раз в час?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    пускать через обработчик deduplicated
    https://symfony.ru/logging/monolog_email.html
    Ответ написан
    Комментировать
  • Как в PHP создать свою глобальную функцию?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Для такой отладки можно добавить в прожект компонент VarDumper – он из Symfony, но можно и использовать отдельно.

    Появятся две глобальные функции dump() и dd(), много удобнее базовой var_dump()

    Но лучше очень полезно разобраться и использовать XDebug — представьте, насколько удобнее ткнуть любую строчку кода — и в ней исполнение встанет на паузу, а вы сможете посмотреть значения всех переменных на этот момент.
    Ответ написан
    Комментировать
  • Как выполнить любую функцию php и всегда получить true?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Всегда как true if (func() or true)

    Всегда как false if (func() and false)
    Ответ написан
  • Как определить русский текст 18+?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. обучить свою модель на большом объеме текстов бинарной ("да/нет") классификации;
    2. запустить модель как сервис с HTTP интерфейсом;
    3. обращаться к сервису из своего кода (HTTP-запрос), получать ответ "да/нет"

    Вот нечто подобное для определения токсичности комментов.

    Более красивым решением было бы переписывать недопустимое с использованием исключительно допустимой лексики. Хотя возможны ньюансы..
    Ответ написан
    2 комментария
  • Как удалить из массива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Так вы только копируете значение (строку  "1") из подмассива в переменную:
    $del = $arr[1]['one'];
    В переменную $del записался байт ASCII-сивола "1", условно говоря.

    unset здорового человека именно такой: unset($arr[1]['one'])

    unset курильщика можно организовать записью ссылки на массив в переменную. Но конкретный ключ всё равно придётся указывать внутри unset:
    $arr = [ 1 => [
        'one' => '111',
        'two' => '222',
    ],  ];
    
    $del = & $arr[1]; // ссылка на массив
    unset($del['one']); // удаление ключа из массива по ссылке
    
    print_r($arr); // результат Array ( [1] => Array ( [two] => 222 ) )


    Попытка удалить полную ссылку на элемент не сработает, т.к. она просто удалит "связь" этой переменной $del с элементом исходного массива. А массив останется без изменений.
    $del = & $arr[1]['one']; // ссылка на элемент, который хочется удалить
    unset($del); // не сработает. Просто разорвёт ссылку $del на элемент
    Ответ написан
    2 комментария
  • Как можно укоротить код в foreach?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    /**
     * Переделать массив объектов, добавив префикс названию каждого из свойств
     * @param array<object> $srcArray исходный массив объектов
     * @param string $prefix строка, которую добавить перед названием каждого из свойств
     */
    $remap = fn (array $srcArray, string $prefix) => array_map(
        function ($obj) use ($prefix) {
            $keyValues = get_object_vars($obj);
            $keys = array_keys($keyValues);
            $values = array_values($keyValues);
            return (object) array_combine(
                array_map(fn ($key) => $prefix . $key, $keys),
                $values
            );
        },
        $srcArray
    );


    Test
    // Test
    $babySitters = [
        (object) ['a'=>'A1', 'b'=>'B-1'],
        (object) ['a'=>'A2', 'b'=>'B-2'],
        (object) ['a'=>'A3', 'b'=>'B-3'],
        (object) ['a'=>'A4', 'b'=>'B-4', 'c'=>'C4'],
    ];
    
    $result = $remap($babySitters, 'babysitter_');
    
    echo json_encode($result);


    Результат:
    [
      {
        "babysitter_a": "A1",
        "babysitter_b": "B-1"
      },
      {
        "babysitter_a": "A2",
        "babysitter_b": "B-2"
      },
      {
        "babysitter_a": "A3",
        "babysitter_b": "B-3"
      },
      {
        "babysitter_a": "A4",
        "babysitter_b": "B-4",
        "babysitter_c": "C4"
      }
    ]

    Ответ написан
    Комментировать
  • Как числа из строки поместить в массив?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $str = ' 86, 92, 98, 104, 110';
    $arr = json_decode("[ $str ]");
    Ответ написан
    Комментировать
  • Как поменять местами максимальное и минимально число в массиве?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    попробуйте представить, как оно будет работать, в замедленном режиме.
    Что, если массив не 5 чисел, а несколько миллионов, длиннющий?
    Хорошо бы его проходить только 1 раз. И по пути находить минимум и максимум, и их индексы.
    Как?
    Сначала и min и max это первое значение, а оба индекса 0.
    Далее с очередным элементом массива смотрим, больше ли он нашего "максимума"? Если да, то он становится максимумом, а текущий индекс — индексом максимума. То же с минимумом. Если меньше текущего минимума, то ...
    Прошли весь массив — ок, имеем минимум, максимум, их индексы.
    Меняем местами элементы по индексам.
    Ответ написан
    Комментировать
  • Как хранить функцию в массиве?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Всё в документации: Обращение к функциям через переменные ("Variable functions" на англ.)
    Ответ написан
    Комментировать
  • Какой ставить CENTRIFUGO_URL, если запустил под докером?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Наскоро посмотрел — они там пишут, по умолчанию URL http://localhost:8000/api

    Из вопроса не понятно, у вас только центрифуга в контейнере, а приложение на хосте, или всё в докере.
    Если приложение на хосте, надо не забыть высунуть наружу порт docker run -p 8000:8000
    Если всё в docker-compose, то да, по имени контейнера стучаться, и тоже не забыть порт указать http://centrifugo:8000/api
    Ответ написан
  • PHP websocket насколько сильно он уступает node.js по производительности?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Open Swoole – мощный супер-быстрый асинхронный PHP.
    WebSocket'ы, корутины, высокая нагрузка.

    Пример WebSocket сервера:
    <?php
    
    use OpenSwoole\WebSocket\Server;
    use OpenSwoole\Http\Request;
    use OpenSwoole\WebSocket\Frame;
    
    $server = new Server("0.0.0.0", 9502);
    
    $server->on("Start", function(Server $server)
    {
        echo "OpenSwoole WebSocket Server is started at http://127.0.0.1:9502\n";
    });
    
    $server->on('Open', function(Server $server, OpenSwoole\Http\Request $request)
    {
        echo "connection open: {$request->fd}\n";
    
        $server->tick(1000, function() use ($server, $request)
        {
            $server->push($request->fd, json_encode(["hello", time()]));
        });
    });
    
    $server->on('Message', function(Server $server, Frame $frame)
    {
        echo "received message: {$frame->data}\n";
        $server->push($frame->fd, json_encode(["hello", time()]));
    });
    
    $server->on('Close', function(Server $server, int $fd)
    {
        echo "connection close: {$fd}\n";
    });
    
    $server->on('Disconnect', function(Server $server, int $fd)
    {
        echo "connection disconnect: {$fd}\n";
    });
    
    $server->start();
    Ответ написан
    Комментировать
  • Как заменить функционал Sublime Text 3 У visual studio code?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. cmd + F2 (на маке) выделит все включения текущего слова. Мульти-курсор, можно заменить или допечатать/удалить часть – везде и сразу ©
    2. поиск в VSCode офигенный. И по документу, и по всему проекту, причем можно открыть несколько «редакторов поиска». Искать и с учётом регистра, совпадением слова целиком, регулярными выражениями. Белый/черный список расширений файлов, папок. Исключить / включить папки типа vendors или node_modules.
    3. cmd + shift + P и начать печатать "Emmet: Balance (inward)" – и выбрать команду
    4. плагин PHP Intelephense, и не забыть отключить VSCode PHP Language Features, как пишут по ссылке в разделе Quick Start


    Скачайте/распечатайте самые популярные клавишные команды VSCode под Windows, под Mac или под Linux.
    Ответ написан
    5 комментариев
  • Как отловить баг на продакшене?

    sergiks
    @sergiks Автор вопроса, куратор тега PHP
    ♬♬
    Нашли опытным путём некоторые действия, которые 100% приводили к нежелательному изменению данных.
    Перерыли весь их код – ничего.

    Глубокой ночью решились временно включить на проде дебажный режим кернела Symfony.

    И повторив запрос, в профайлере нашли причину: один из разработчиков накостылил изменения на проде в /vendor/ доктрин-бридже. Он ошибочно полагал, что это ни на что не повлияет и никак не связано с появившейся проблемой.

    Два дня «веселья».
    Ответ написан
    Комментировать
  • Что надо сделать что бы таймер не сбрасывался при обновлении страницы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    лучше один раз в начале определить дату-время окончания отсчёта, и её 1 раз сохранить сразу же в LocalStorage.

    По таймеру показывать разницу текущего времени и «времени Че».

    Таймеры не точны. Поэтому лучше зарядить этот таймер не на 1 секунду, а чаще, на 250 мс, например — это поможет избежать иногда проскакивания секунды или, наоборот, чуть более быстрой смены.
    Ответ написан
    Комментировать
  • Как объединить несколько массивов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $keys = ['sku', 'brand', 'City1', 'City2'];
    $setKeys = function ($values) use ($keys) {
    	return array_combine($keys, $values);
    };
    
    $data = [ [1,2,3,4], [11,22,33,44], ];
    
    $result = array_map($setKeys, $data);

    $result
    Array
    (
        [0] => Array
            (
                [sku] => 1
                [brand] => 2
                [City1] => 3
                [City2] => 4
            )
    
        [1] => Array
            (
                [sku] => 11
                [brand] => 22
                [City1] => 33
                [City2] => 44
            )
    
    )
    Ответ написан
    Комментировать
  • Почему при нажатии на второй чек бокс срабатывает первый?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    id должны быть уникальными.
    <?php
    foreach ($logs as $i => $val) { ?>
    ...
    <input type="checkbox" id="switch-1-<?php echo $i; ?>" 
    ...
    <input type="checkbox" id="switch-2-<?php echo $i; ?>"
    Ответ написан
  • Как с html формы собирать данные в .txt?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Начните с упрощенной формы с единственным полем и кнопкой submit. Добейтесь, чтобы данные записывались в файл.

    Полям надо давать имя: атрибут name Например
    <input type="text" name="first_name" placeholder="First name">
    
    <select name="day_of_week">
      <option value="1">Monday</option>
      <option value="2">Tuesday</option>
      <option value="3">Wednesday</option>
    </select>


    PHP примерно такой:
    <?php
    $filename = 'form_responses.txt';
    
    if (!empty($_POST)) {
        $record = [
            // перечисляются поля формы
            'first_name' => filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING),
            'day_of_week' => filter_input(INPUT_POST, 'day_of_week', FILTER_SANITIZE_NUMBER_INT),
        ];
    
        $recordString = implode('; ', $record) . PHP_EOL; // склеить значения через точку с запятой
    
        file_put_contents($filename, $recordString, FILE_APPEND);
    }
    Ответ написан
    Комментировать
  • Как игнорировать или пропускать варнинги при вставке значений из одного массива в другой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Начиная с PHP v.7.0 можно использовать Null Coalescing operator ??
    $field1 = 'Habr';
    $field2 = 'QnA';
    $array = [
      'id' => $data->xxx->yyy->id ?? null,
      'name' => $data->{'name'} ?? 'untitled',
      'site' => $data->$field1->$field2 ?? 'поиск';
    ];
    если запрошенного поля нет, ошибку не бросает, а берет значение по умолчанию, которое после ??
    Ответ написан
    2 комментария
  • Почему выводится NaN в данном случае?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Так не будет работать.
    Вы через PHP забираете статичный HTML той страницы. Элемент с классом tv-symbol-price-quote__value js-symbol-last там — пустой. Это после обработки в браузере JS, в тот элемент попадает обновляемое значение котировки.

    Обновления, вроде бы, приходят по постоянному WebSocket соединению.
    Ответ написан
    4 комментария