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

    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>";
    	}
    }
    Ответ написан
    Комментировать
  • Как убрать вывод нуля при $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. узнать, что все эти задачи – типовые, часто востребованные, и поэтому есть масса готовых решений – и научиться их находить и использовать
    Ответ написан
    9 комментариев
  • Как однозначно конвертировать цвет из RGB в HSL и обратно, получая один и тот же результат?

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

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

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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. ассоциативный массив, где ключи даты, значения обозначают начало это или конец интервала.
    2. отсортировать по ключам
    3. двигаться слева направо, следить чтобы не было два начала подряд.
    Ответ написан
  • Как лучше реализовать постоянный отсчёт времени и суммирование значений?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо ли иметь в БД статичное значение баллов? Может, оставить свойство вычисляемым — когда требуется узнать про конкретного пользователя, сколько у него баллов — выполняется поиск купленных им карточек за последние 10 дней и до сих пор активных, и суммируются.

    Либо можно обновлять базу cron-задачей. Округлить до какого-то интервала времени: 1 сутки (если все в одном городе), или 1 час, если пользователи со всех частей света. Карта начинает действовать в ближайший следующий «момент» после активации. В ближайшую полночь, скажем.

    1000 пользователей по 5 карточек — это не нагрузка, всё легко отработает.
    Ответ написан
    1 комментарий
  • Как одновременно запустить 1500 ботов, выполняющих http запросы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если с PHP, то я бы делал это в Swoole: там и свои таблицы-в-памяти, и корутины, чтобы «сон» не тормозил остальных, — и вообще полезный опыт.

    P.S. не надо заниматься спамом, накрутками и прочим абьюзерством!
    Ответ написан
    2 комментария
  • Можно как то суммировать эти цифры использую цикл php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    $sum = 0;
    for ($i = 9; $i <= 40; $i++) {
        if ($i % 2 === 0) {
            $sum += $i;
        }
    }
    echo "Сумма: $sum" . PHP_EOL;
    Ответ написан
    Комментировать