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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Как вы удаляете элементы? Если через unset() или array_filter(), индексы сохраняются.
    Ответ написан
    5 комментариев
  • Заключение переменных в двойные кавычки, нормально или грех?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    В некоторых IDE подсветка синтаксиса не работает для случая переменной-в-строке. Для меня лично это основная причина избегать такого стиля.

    А вообще это «нормально».
    Ответ написан
    6 комментариев
  • Как редактировать запись в txt файле?

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

    spoiler
    function appendValue($key, $value) {
      $filepath = "./config.txt"; // путь к файлу
      if (!file_exists($filepath)) throw "File not found";
      
      $divider = PHP_EOL; // разделитель строк
      
      $rows = explode($divider, file_get_contents($filepath));
      $tmpfname = tempnam(sys_get_temp_dir(), 'Toster');  
      $fh = fopen($tmpfname, 'w');
      
      $replaced = 0;
      foreach($rows as $row) {
        $data = explode(':', $row);
        if (0 === count($data)) continue;
        if ($data[0] == $key) {
          array_push($data, $value);
          $row = implode(':', $data);
          $replaced++;
        }
        
        fputs($fh, $row . $divider);
      }
      
      fclose($fh);
      
      // поменять файлы местами
      unlink($filepath);
      rename($tmpfname, $filepath);
      
      return $replaced; // кол-во обновлённых строк. Вдруг, неуникален индекс?
    }
    
    
    appendValue(2, 33);
    Ответ написан
  • Как получить число и месяц, преобразов переменную на php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно получить время, скажем, понедельника на этой неделе через относительный формат времени strtotime('monday this week'); (только на англ.)
    $rusdate='ПТ 18:00';
    list($dow, $hours, $minutes) = sscanf($rusdate, "%s %d:%d");
    
    $rusweek = explode(',','ВС,ПН,ВТ,СР,ЧТ,ПТ,СБ');
    $ndow = array_search($dow, $rusweek);
    
    date_default_timezone_set('Europe/Moscow'); // если не настроен PHP
    $time = strtotime('monday this week') + 86400 * $ndow + 3600 * $hours + 60 * $minutes;
    echo date('Y-m-d H:i:s', $time);
    // 2018-10-13 18:00:00
    Ответ написан
  • ООП ли фреймворк miniPHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Там в исходниках вовсю определения классов – так что можно сказать, что да, объектно-ориентированный.
    Ответ написан
    2 комментария
  • Как отправить post/get запрос через несколько секунд после открытия страницы?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Примерно так:
    setTimeout(() => {
      const url = 'https://api.vk.com/method/users.get';
      const data = 'Y=YparameterValue&Z=ZparameterValue';
      const xhr = new XMLHttpRequest();
    
      xhr.open('POST', url, true);
      xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      xhr.send(data);
    
    }, 5000);
    Ответ написан
    4 комментария
  • Как вывести среднее значение с массива?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    MySQL:
    SELECT AVG(`balance`) as Srednee FROM `balance_pp` WHERE `pp_name`='Ad1' LIMIT 5


    или PHP:
    array_sum( array_values( $result) ) / count( $result)
    Ответ написан
    1 комментарий
  • Верна ли записана конструкция if?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Верно.

    Вы пробовали проверить? Написать тест с двумя вариантами значения $a и посмотреть ; )

    Заметьте, что если вместо точки-с-запятой после echo вы напишете запятую, то назначение $b выполнится только в случае истинности условия в if:
    $a = false;
    
    if ($a) echo "не пусто"; $b = 1; // назначение $b выполнится всегда
    
    if ($a) echo "не пусто", $b = 1; // назначение $b выполнится только при истинности $a
    // второй вариант плохой, не делайте так. Результат $b = 1 передается как аргумент в echo
    // лучше использовать фигурные скобки:
    if ($a) {
      echo "не пусто";
      $b = 10;
    }
    // в скобках лучше читается
    Ответ написан
    3 комментария
  • Как проверить большой массив?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    PHP может прилечь на этапе json_decode(), если json файл окажется слишком большим.

    Поэтому лучше один раз перевести все данные во что-то подходящее для задачи: в MySQL, Mongo, Elasticsearch или что-то ещё.

    Адский велосипед, это читать json-файл построчно и парсить вручную, без json-decode. Спасёт от нехватки памяти, будет медленно и со скрипом.
    Ответ написан
    Комментировать
  • Как запретить параллельное (одновременное) использование одного аккаунта разными пользователями?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Залогиненный пользователь должен «запирать» под себя аккаунт, не допуская дополнительные входы под этим же аккаунтом.

    Как отличать «этот» визит от «других». Точно не по IP, т.к. пользователь может быть мобильным. По «отпечатку браузера» или по набору cookies.
    При очередном запросе мутировать куку, чтобы копирование кук на другое устройство не помогло. Что-то вроде CSRF-токенов использовать при каждом запросе.
    На случай вылета пользователя предусмотреть timeout, по истечении которого разрешать любой логин в этот аккаунт.
    Ответ написан
    2 комментария
  • Как сделать такой массив из двух циклов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Одним запросом получить объединенные строки (клиент, товар), отсортировпнные по клиентам.

    Держать переменную “текущего клиента”. Пока он не поменялся, заполнять тоаары для него. Сменился - ноаая запись клиента с массивом товаров пошла заполняться.
    Ответ написан
    Комментировать
  • Как ограничить по времени, доступ по пин-коду?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Вот вы и столкнулись с задачей, несовместимой с планом сделать все на коленке без “излишков” вроде БД и фреймворка.

    На текстовом файле сделать можно, но это сломается при почти-одновременных запросах и будет заметно тормозить. С очередным пином есть 4 варианта: нет в списке, есть и ранее не использовался, есть и прошло менее 90 дней, есть и просрочен. В 2 из них надо вносить в файл изменения: помечать время или удалять запись. Для файла нет операции “вставить в середине или удалить из середины файла байты с А по Б”, поэтому придется создавать новый файл, переписывая все строки кроме удаляемой, и потом заменять старый файл новым.
    Медленно и неэффективно.

    Все-таки разберитесь с MySQL. Это модно, спортивно, современно.
    Ответ написан
    Комментировать
  • Как реализовать данную функцию?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    function num($amount) {
      return max( 100 * floor($amount / 100), 100);
    }


    проверка
    for($i = 0; $i < 500; $i += rand(0,90)) {
    	printf("%3d -> %3d\n", $i, num($i));
    }

    Результат:
    0 -> 100
      2 -> 100
     57 -> 100
    105 -> 100
    118 -> 100
    166 -> 100
    249 -> 200
    254 -> 200
    295 -> 200
    307 -> 300
    315 -> 300
    349 -> 300
    403 -> 400
    437 -> 400
    480 -> 400
    488 -> 400
    Ответ написан
    Комментировать
  • VK_API как отсылать случайные изображения?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. получить список изображений в альбоме группы: photos.get()
    2. выбрать N случайных
    3. отправить их как приложения к сообщению: поле attachment в messages.send()
    Ответ написан
    6 комментариев
  • Ffmpeg зациклить видео, как?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Возможно, mp4 не позволяет простой конкатенации файлов, поэтому при склейке он декодируется и снова жмётся.

    Быстрее один раз разжать видео в .ts формат, который потом можно просто склеивать.
    Делал похожее для сборки mp3+картинки в статичное видео.

    Примерно так:
    bash скрипт
    #  из mp4 сделать ts
    TMPVIDEO="tmp_video.ts"
    ffmpeg  \
      -i "short.mp4"  \
      -bsf:v h264_mp4toannexb  \
      -an  \
      -f mpegts  \
      -y -hide_banner  \
      "$TMPVIDEO"
    
    # до этого определить, сколько раз повторить фрагмент,
    # чтобы покрыть длину mp3
    REPEATS=5
    LONGVIDEO="long_video.ts"
    N=1
    while [ $N -le $REPEATS ]; do
    	ffmpeg -i "concat:$TMPVIDEO|$TMPVIDEO" \
    	    -c:v copy \
    	    -y -hide_banner  \
    	    "$LONGVIDEO"
    
    	local STATUS=$? ; if [ $STATUS -ne 0 ]; then return $STATUS; fi
    
    	rm -f "$TMPVIDEO"
    	mv "$LONGVIDEO" "$TMPVIDEO"
    	local N=$[$N << 1]
    	echo "N: $N"
    done
    # получили длинное видео с запасом
    
    # подрезать длину, чтобы точно соответствовала
    FFMPEG -i "$TMPVIDEO" \
      -c:v copy \
      -t $MUSIC_LENGTH \
      -y -hide_banner  \
      "$LONGVIDEO"


    Потом остаётся собрать из аудио и видео общий файл. В mp4 аудио идёт в формате AAC. Для скорости можно заранее разжать mp3 в aac, заодно измерив точную длительность.
    Ответ написан
  • Как после "10" вызовов function write() в сек, блокировать её на "10мин"?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На стороне сервера – надо сохранять массив времен последних вызовов функции. При очередном вызове смотреть число времен в этом массиве и время самого раннего. Дописывать в конец текущее время и удалять записи старше 1 секунды.

    В качестве хранилища можно использовать Redis или другое хранилище в памяти.

    Если квота распространяется на каждого юзера в отдельности - хранить для каждого отдельно. В качестве ключа использовать в т.ч. user_id.

    На клиенте похожий принцип: хранить массив времен вызовов и проверять число и время самого раннего при каждом.
    Ответ написан
    Комментировать
  • Что делает этот код php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Перебирается массив серийников. Путём нехитрых битовых операций сравниваются производные от URL и от последних двух частей в серийнике. Если совпадают, в массив Core::$url дописывается ключ "key" со значением подошедшего ключа.

    Разобрать длинную строку удобнее, разбив конструкцию:
    $d = array('test-site', 'ru');
    $e = array('ST-214E2210-33FE865E-EC05E9A3', 'ST-204C2010-3DEFEFBE-C30E1243', 'ST-214E4000-3D4F3356-E2BCEEBB');
    
    do {
      $b = implode('.', $d); // склеили, получили "test_site.ru"
              
      foreach ($e as $sKey){ // перебираем ключи
        $a = explode('-', $sKey) + array(0, 0, 0, 0); // разбили по дефису в массив,
        // убедились, что в массиве как минимум 4 элемента (если меньше, допис. нулями)
                    
        !( // логическое отрицание того, что в скобках
        	Core::convert64b32( // из 64 бит в 32
        		Core::convert64b32(
        			hexdec($a[3]) // последний фрагмент ключа перевели из 16-ричного в 10-е число
        		) 
        		^  // ксор, побитовое исключающее ИЛИ
        		abs(Core::crc32($b))  // 32-битное число, хэш из адреса сайта
        	) 
        	^  // XOR см. выше
        	~(  // побитовое отрицание
        		Core::convert64b32(
        			Core_Array::get( // тут из конфига получают значение "hostcms" 
        				Core::$config->get('core_hostcms'),
        				'hostcms'
        			)
        		) 
        		&  // побитовое И
        		abs(Core::crc32($b))
        		^
        		Core::convert64b32(
        			hexdec($a[2]) // предпоследний фрагмент из ключа, как число
        		)
        	)
        )
        &&  // только если выше в скобках получился 0, выполнится следующая строка
        Core::$url['key'] = $sKey;
      }
      array_shift($d);
    } while(count($d) > 1);
    
    $a = explode('-', $sKey) + array(0, 0, 0, 0);
    Ответ написан
    Комментировать
  • Как составить строку из значений нескольких переменных php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Выбирайте:
    "$a$b$c";     //  в двойных кавычках подставляются значения (интерполяция)
    $a . $b . $c; // точка - оператор конкатенации
    implode('', [$a, $b, $c]);     // склеиваем массив 
    sprintf('%s%s%s', $a, $b, $c); // "печатаем" по формату и возвращаем результат
    Ответ написан
    Комментировать
  • Как сравнить элементы многомерного массива между собой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сортируйте наборы и склеивайте в строку – используйте полученные строки как ключи массива. Значения – массивы ключей исходного.

    Так получите под одним ключем "cloo" два значения ["cool", "looc"], а для остальных по одному.

    spoiler
    <?php
    $data = [
    	"cool" => [0 => "c", 1 => "o", 2 => "o", 3 => "l"],
      "looc" => [0 => "l", 1 => "o", 2 => "o", 3 => "c"],
      "test" => [0 => "t", 1 => "e", 2 => "s", 3 => "t"],
      "set"  => [0 => "s", 1 => "e", 2 => "t"],
      "get"  => [0 => "g", 1 => "e", 2 => "t"]
    ];
    
    $groups = [];
    foreach( $data AS $k => $v) {
    	sort($v);
    	$hash = implode('', $v);
    	if(!isset($groups[$hash])) $groups[$hash] = [];
    	array_push($groups[$hash], $k);
    }
    $result = array_values($groups);
    
    print_r($result);
    /*
    Array(
        [0] => Array
            (
                [0] => cool
                [1] => looc
            )
    
        [1] => Array
            (
                [0] => test
            )
    
        [2] => Array
            (
                [0] => set
            )
    
        [3] => Array
            (
                [0] => get
            )
    )
    */
    Ответ написан
    3 комментария