Ответы пользователя по тегу PHP
  • Почему при нажатии на второй чек бокс срабатывает первый?

    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 лежат отдельно от проекта, поэтому их не прилагают. Хотя иногда приводят пример в документации.
    Ответ написан
    Комментировать
  • Как разделить диапазон дат на 3 части?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Три зоны на отрезке:
    1. до 1 сентября
    2. между 1 сент. и 31 окт
    3. после 31 окт
    Это три варианта начала, три варианта конца (совпадает или после начала)
    Из 3x3=9 комбинаций, реально возможны только 6. Дающие 1, 2 или 3 отрезка на выходе:
    .
         начало
       ---|---|---
    к | 1
    о -
    н | 2   1
    е -
    ц | 3   2   1


    Для простоты, та же задача с числами. Есть фиксированный отрезок 20..30 (сентрябрь - октябрь). И даются на вход два числа, второе больше первого.

    Можно «в лоб» записать логику условиями if - else if - else
    треш-код через условия
    function ranges(int $a, int $b): array
    {
        $start = 20;
        $finish = 30;
    
        $result = [
            'before' => null,
            'match' => null,
            'after' => null,
        ];
    
        if ($a < $start) {
            if ($b < $start) {
                $result['before'] = [$a, $b];
            } else {
                $result['before'] = [$a, $start];
                if ($b < $finish) {
                    $result['match'] = [$start, $b];
                } else {   
                    $result['match'] = [$start, $finish];
                    $result['after'] = [$finish, $b];
                }
            }
        } else if ($a < $finish) {
            if ($b < $finish) {
                $result['match'] = [$a, $b];
            } else {
                $result['match'] = [$a, $finish];
                $result['after'] = [$finish, $b];
            }
        } else {
            $result['after'] = [$a, $b];
        }
    
        return $result;
    }
    
    print(json_encode(ranges(5, 25))); // {"before":[5,20],"match":[20,25],"after":null}
    Но стоит подумать над более красивым решением. Положить все 4 значения в массив и отсортировать его по возрастанию. 4 значения определяют 3 смежных отрезка. Некоторые из отрезков стоит проигнорировать, если они за рамками входного диапазона.

    $arr = [$start, $finish, $a, $b];
    sort($arr, SORT_NUMERIC);
    Ответ написан
    Комментировать
  • Как в массиве чисел найти средний минимум и средний максимум?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    идти по массиву, вычислять разницу с предыдущим значением.
    Если разница поменала свой знак — предыдущая точка была локальным минимумом или максимум. Смотреть на знак разницы:
    1, 2, 3, 2, 3, 2, 1
    0  +  +  -  +  -  -
          ^  ^  ^ в этих точках знак поменялся
    Складывать найденные точки в два массива: максимумы и минимумы.
    Потом посчитать среднее в каждом.
    Ответ написан
    3 комментария
  • Функции хелперы, что это и зачем они нужны если и без них всё работает?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Бывает непреодолимое желание избегать повторяющихся кусков кода. Часто оно здраво и ведёт к правильному рефакторингу кода.

    Когда повтор происходит внутри одного класса, его можно выделить в приватный метод этого же класса.

    Но бывает, один и тот же изолируемый функционал требуется в совершенно разных кусках приложения. Отсутствует какой-то один класс, куда его логично упрятать. Тогда можно создать хэлпер — например, класс со статическим методом, и вызывать его откуда угодно. Ну, или сервис..

    Для вдохновения и красивой архитектуры посмотрите на хэлперы в Laravel
    Ответ написан
    1 комментарий
  • Как сделать прогресс бар скачивания одного файла?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    нужно создать потоковый контекст и использовать stream-notification-callback (см. пример).

    Функция будет вызываться в процессе загрузки / выгрузки файла, сообщая о количестве переданных байтов. Это то, что нужно для отрисовки прогресс-бара.
    Ответ написан
    2 комментария
  • Как с помощью регулярное выражение получить все числа после слова?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    можно без (тяжелых) регулярок — с помощью sscanf():

    $str = "attachment=12345";
    list($number) = sscanf($str, "attachment=%d");
    
    echo $number; // 12345
    Ответ написан
    Комментировать
  • Как исправить ошибку в VK API Invalid request: v is required. Version param should be passed as "v". "version" param is invalid and not supported?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    ...[key] => album_id [value] => 286941183version=5.131

    ничего не смущает?

    Перед . http_build_query() надо ещё & добавить.

    По-хорошему, все параметры, включая owner_id и album_id лучше в общий массив, а потом http_build_query(). Для порядка. Заметите, что owner_id дублируете.
    Ответ написан
    Комментировать
  • Какие аналоги fetch есть в PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Три популярных способа выполнять веб-запросы в PHP:
    1. file_get_contents() – не самый удобный, но не требует установки зависимостей т.к. является частью ядра PHP
    2. curl – PHP должен быть собран с этой библиотекой, чаще всего на хостингах так и есть по умолчанию.
    3. Guzzle HTTP – устанавливается через Composer и значительно упрощает работу с запросами


    В PHP запросы чаще выполняют синхронно, без событий-промисов, хотя такая возможность и появилась.
    Выполнили запрос – дождались ответа. В следующей строчке работаете с полученным ответом.
    Ответ написан
    Комментировать
  • Разработать REST API - как изучать?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. понимать, как устроены веб запросы (чем GET принципиально отличается от POST и PUT)
    2. уметь спланировать и создать таблицу в базе данных
    3. работать с базой данных в PHP: подключаться, вставлять новые записи, находить существующие
    4. принимать и обрабатывать веб-запросы на PHP, фильтровать и валидировать данные. Возвращать ответы и сообщать о возможных ошибках.
    5. узнать, что все эти задачи – типовые, часто востребованные, и поэтому есть масса готовых решений – и научиться их находить и использовать
    Ответ написан
  • Как однозначно конвертировать цвет из RGB в HSL и обратно, получая один и тот же результат?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    цветовые пространства RGB и HSL не совпадают, поэтому несоответствия неизбежны.

    Например, полностью черному rgb(0, 0, 0) соответствует множество hsl(*, *, 0).

    Хотя например, в этой работе предлагают точный целочисленный метод конвертации: Integer-based accurate conversion between RGB and ... (на англ.). Один из авторов — Владимир Чернов, выпускник Петербургского Политехнического университета.
    Ответ написан
    1 комментарий