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

    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 комментария
  • Что означает данная запись в 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 комментария
  • Вывод значений из многомерного массива без вложенных циклов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    foreach ($massive as $value) {
    	if (is_array($value)) {
    		list($id, $name) = $value;
    		echo "<p>$id $name</p>";
    	} else {
    		echo "<p>$value</p>";
    	}
    }
    Ответ написан
    Комментировать