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

    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 комментария
  • Что означает данная запись в PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    см. Массивы
    Короткий синтакс массива заменяет array() на []

    $options[$k] = [$row['value']];
    // то же самое, что 
    $options[$k] = array($row['value']);
    Создаёт массив с единственным элементом. И присваивает его в $options[$k]

    Ещё примеры:
    $arr1 = [ 1, 2, 3 ];
    // то же самое, что 
    $arr1 = array(1, 2, 3);


    $arr2 = [
        'Habr' => 'QnA',
        'Stack' => 'Overflow',
    ];
    // то же самое, что 
    $arr2 = array(
        'Habr' => 'QnA',
        'Stack' => 'Overflow',
    );
    Ответ написан
    Комментировать
  • Из двух циклов сделать один?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    array_merge() наложит на дефолтные значения то, что передали из формы.

    $args = [
        'name1' => FILTER_SANITIZE_STRING,
        'age1' => FILTER_SANITIZE_NUMBER_INT,
        'weight1' => FILTER_SANITIZE_NUMBER_FLOAT,
    ];
    
    $defaults = [
        "name1" => "по умолчанию",
        "age1" => "по умолчанию",
        "weight1" => "по умолчанию",
    ];
    
    $results = array_merge($defaults, filter_input_array(INPUT_GET, $args));
    
    // вывод
    foreach ($results as $name => $value) {
        printf('<p>%s: %s</p>', $name, $value);
    }
    Ответ написан
  • Поиск в массиве по двум значениям?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    for ($i = 0; $i < count($arr); $i++) {
        if ( условие1 && условие2 ) {
            // ура, нашли!
            break;
        }
    }

    Конечно же, вы уже пробовали перебирать массив и проверять оба условия, но что-то пошло не так.

    Что именно?
    Ответ написан
  • Кнопка создать select?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Вывести данные для опций один раз, и положить их в константу:
    spoiler
    $options = [
        [null, $_LNG['TYPE_ORDER']],
        ['select_all', $_LNG['ALL_TYPES']],
        ['select_domain', $_LNG['DOMAIN']],
        ['select_server', $_LNG['SERVER']],
        ['select_ssl', $_LNG['SSL']],
        ['select_desing', $_LNG['DESING']],
        ['select_script', $_LNG['SCRIPT']],
        ['select_layout', $_LNG['LAYOUT']],
        ['select_adv', $_LNG['ADV']],
        ['select_seo', $_LNG['SEO']],
    ];
    
    printf('const options = %s;', json_encode($options));


    Вот такая JS функция динамически создаёт из этих options полноценный элемент select со всеми опциями:
    createSelect = () => {
      const select = document.createElement('select');
      options.forEach(([value, title]) => {
          const option = document.createElement('option');
          option.innerText = title;
          if (value) {
            option.value = value;
          } else {
            option.setAttribute('disabled', true);
            option.setAttribute('selected', true);
          }
          select.appendChild(option);
        });
      return select;
    };

    Создали селект – одновременно создаём кнопку, но пока её прячем. Референс на созданный селект и кнопку держим. По событию выбора в свежесозданном селекте – показать изначально скрытую кнопку "Добавить".

    Нажатие на кнопку создаёт ещё один селект-с-кнопкой.

    Ответ написан
    3 комментария
  • Как убрать вывод нуля при $amount = 1?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Округление дело такое. При коэффециенте 0.25 как ни округляй, будет 0 для $amount < 2

    refactor
    $rand = mt_rand(1, 1000);
    $bad = '...';
    
    if ($rand < 150) {
        $k = 1;
        $message = '$ (x0) ❌';
    } elseif ($rand < 300) {
        $k = 0.75;
        $message = "$ (x0.25) $bad";
    } elseif ($rand < 450) {
        $k = 0.5;
        $message = "$ (x0.5) $bad";
    } elseif ($rand < 600) {
        $k = 0.25;
        $message = "$ (x0.75) $bad";
    }
    
    $delta = round($amount * k);
    $res = $user->balance - $delta;
    $restxt = 'Вы проиграли ' . number_format($delta, 0, '', '.') . $message;


    Если "бизнес-логика" настолько странная, что и округлять в меньшую сторону, и сделать исключение для 1 и только для неё, то
    $delta = $amount === 1 ? max(1, floor($amount * k)) : floor($amount * $k);
    но следующий вопрос будет «а вот 2 при $k === 0.25 тоже округляется до 0»
    Ответ написан
    1 комментарий
  • Как получить случайную дату между двумя датами?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Посчитать число дней между датами,
    Получить случайное целое от 0 до этого числа дней.
    Добавить к меньшей дате полученные случайные дни.
    $start = new DateTimeImmutable('1878-10-11');
    $finish = new DateTimeImmutable('2009-10-13');
    $interval = $start->diff($finish);
    $daysDiff = $interval->format('%a');
    $randomDays = rand(0, $daysDiff);
    $randomDate = $start->add(new DateInterval("P${randomDays}D"));
    
    echo $randomDate->format('Y-m-d'); // 1896-06-24
    Ответ написан
    Комментировать
  • Почему php разработчики используют .htaccess как часть системы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Незачем пытаться охватить все веб-серверы. Для урока авторы, видимо, решили, что «сойдёт и так» – на примере одного из популярных, Apache.

    Вы уже переросли песочницу тех уроков и знаете другие варианты. Значит, сумеете понять и перенести правила из .htaccess в конфиг NGINX. С помощью Google, SO и Habr.QnA )

    Популярен паттерн "front controller" — когда веб-сервер конфигурят, чтобы все запросы падали только на корневой /index.php, а там уже логика внутри PHP узнавала запрошенный URL /section1/page2 и отдавала соответствующий ответ. Такие решения универсальны относительно веб-сервера.

    Файл .htaccess иногда кладут в проект, потому, что это легкий невидимый файл, который не помешает. Но поможет понять ожидаемое поведение веб-сервера. Конфиги NGINX лежат отдельно от проекта, поэтому их не прилагают. Хотя иногда приводят пример в документации.
    Ответ написан
    Комментировать