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

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Создайте массив для сумм. В каждом посте доставайте значение ключа из sales_amount_title и в общий массив добавляйте под этим ключом значение, или создавайте такой ключ с текущим значением. Переводите сначала значения из строки в числа.

    $totals = [];
    foreach($posts as $post) {
      $key = $post['sales_amount_title'];
      $value = intval( $post['sales_amount_amount'] );
      if(isset($totals[$key])) $totals[$key] += $value;
      else $totals[$key] = $value;
    }
    Ответ написан
  • Как разбить строку в массив?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно использовать регулярное выражение (раз такой тег стоит в вопросе). Буквально «всё, что угодно, затем пробел-со-скобкой, потом всё до скобки, скобка». Из полученного массива выкинуть нулевой элемент, где содержится вся строка целиком:
    preg_match('/^(.+)\ \((.+)\)/', $name, $matches);
    array_shift($matches);
    $matches; /*Array
    (
        [0] => Ньютон И.И.
        [1] => Тринити коледж, Кембридж
    )*/


    Можно и просто отрезать последний символ, а затем разбить в массив, используя в качестве разделителя пробел-с-открывающей-скобкой : )
    без регулярных выражений
    $name = "Ньютон И.И. (Тринити коледж, Кембридж)";
    	$name = substr($name, 0, -1);
    	$result = explode(' (', $name);
    	print_r($result);
    Ответ написан
    1 комментарий
  • Как быстро перебрать большой объем данных?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сделать задачу асинхронной.

    1. присылают объёмный json с данными пользвателей, полем сравнения, (ключами авторизации) и uuid задачи и адресом callback куда ваш api отправит ответ – потом, позже;
    2. данные приняли, сохранили, создали задачу, поместили её в очередь задач, клиенту на запрос ответили "ОК, приняли, сделаем - ответим". Ведь если клиент не один, может, сразу десятку клиентов вздумается именно в полночь прислать по миллиону своих пользователей – итого 10 млн. «В очередь, с*кины дети, в очередь!» «Вас много, а я одна!» : )
    3. один или несколько «рабочих» (серверов, процессов) из очереди забирают каждый по одному заданию и как могут быстро их выполняют, готовят ответ, отправляют по адресу callback. Если отправка не удалась, что-то сглючило на стороне клиентов, в очередь помещается подзадача только повторной отправки ответа через N секунд, не более M раз.
    Ответ написан
    4 комментария
  • Как правильно обработать изображение php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Проблема может быть в правах доступа на папку для аккаунта, под которым работает процесс php.

    Что касается проверки изображения «на изображение» – MIME-тип их определяется только по расширению файла, поэтому можно подсунуть хоть exe'шник, назвав его virus.exe.gif

    Для настоящей проверки на то, что это именно изображение, надо использовать либо функцию в самом PHP либо внешнюю утилиту, которая работает именно со свойствами изображения: размером, цветовой глубиной – gd, ImageMagick, ffprobe от ffmpeg.
    Ответ написан
  • Как в цикле foreach между интерации вставить html тег?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если в JSON нарушится порядок полей, лучше не опираться на порядок в примере. Вдруг будет сначала "Адрес", а потом "Фамилия".
    $baseRow = ['Имя' => '', 'Фамилия' => '', 'Адрес' => '', 'Телефон' => ''];
    
    $template = <<<EOFTMPL
    <tr>
    	<td>%s</td>
    	<td>%s</td>
    	<td>%s</td>
    	<td>%s</td>
    </tr>
    EOFTMPL;
    
    foreach($people as $row) {
    	$row = array_merge($baseRow, $row);
    	printf($template, $row['Имя'], $row['Фамилия'], $row['Адрес'], $row['Телефон']);
    }
    Ответ написан
    Комментировать
  • Как получить конечный(финальный, последний) http статус через cURL если стоит редирект?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо добавить опцию CURLOPT_FOLLOWLOCATION = true, чтобы cURL выполнил все редиректы, и более ничего не менять.

    curl_getinfo($ch, CURLINFO_HTTP_CODE) возвращает статус последнего ответа сервера.
    Ответ написан
  • Как добавить проверку кода 404 при скачивании файла через php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    При выполнении file_get_contents() заполняется специальная переменная $http_response_header – это массив, заполненный строками заголовков ответа сервера. Самая первая – что-то типа "HTTP/1.1 200 OK" в случае найденного файла или "HTTP/1.1 404 Not Found"

    Вытащить оттуда код статуса можно регулярным выражением:
    if( preg_match( "#HTTP/[0-9\.]+\s+([0-9]+)#",$http_response_header[0], $matches ) )
      $reponse_code = intval($matches[1]);
    else $response_code = 0; // не получилось узнать код ответа че-т


    А вообще для веб-запросов удобнее пользоваться cURL
    примерно так
    function getAndSaveFile($url, $path, $fileName = false) {
        // открываем содержимое файла
        $file = @file_get_contents($url);
        // если не удалось получить файл вернем false
        if(!$file) return false;
    
        // получаем имя файла, если не задано, то берем из урла
        if(!$fileName) $fileName = basename($url);
        
        // файл для записи результата
        $fp = fopen($fileName, 'w');
    
        // подготавливаем cURL
        $ch = curl_init();
        curl_setopt_array($ch, array(
    	    CURLOPT_URL => $url,
    	    CURLOPT_FILE => $fp,
    	    CURLOPT_FOLLOWLOCATION => true,
    	    CURLOPT_TIMEOUT => 100,
        ));
    
    	// выполняем запрос
    	curl_exec($ch);
    	
    	// проверяем статус
    	if (curl_errno($ch)) { // какая-то ошибка, таймаут?
    		// закрываем cURL и файл
    		curl_close($ch);
    		fclose($fp);
    		return false;
    	} else {
    		$status_code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    		if( $status_code !== "200") {
    			// закрываем cURL и файл
    			curl_close($ch);
    			fclose($fp);
    			unlink($fileName);
    			return false;
    		}
    		
    		return true;
    	}
    }
    Ответ написан
  • Фреймворк, макро-Фреймворк для разработки портала?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Не надо писать самому «авторизацию и прочие вещи». Для этого и есть фреймворки и модули.

    Порекомендую Laravel. Он не сложный и очень продуманный, «правильный».
    Ответ написан
    Комментировать
  • Можно ли занести несколько значений в переменную в данном php-скрипте?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    wall.post() публикует единственную запись.

    Для промышленных масштабов спама ускорения есть вариант с методом execute(), в который можно обернуть до 25 вызовов АПИ ВКонтакте.

    Т.е. вы на сервере собираете в строку некий код, похожий на JavaScript, что-то типа:
    var params = {
      "message": "Текст поста",
      "from_group": 0,
    };
    var out = { "result": [] };
    
    params.owner_id = 10101; // первая группа
    params.guid = 'abrakadabra';
    out.result.push( API.wall.post(data));
    
    params.owner_id = 20202; // вторая группа
    params.guid = 'drugayaabrakadabra';
    out.result.push( API.wall.post(data));
    // ...
    params.owner_id = 2500025; // 25-я группа
    params.guid = 'uniqueabrakadabra';
    out.result.push( API.wall.post(data));
    
    return out;


    И этот код как текст отправляете параметром code в методе execute()
    Ответ написан
    2 комментария
  • Нужно ли как-то обрабатывать данные из GET запросов?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо ли что-то делать с входными данными зависит от того, что с ними дальше делаете.

    Вставляете прямо в сборку строки SQL-запроса? (НЕ надо так делать!)
    Показываете пользователю в теле страницы? (Надо фильтровать)

    Есть готовые функции для валидации и фильтрации входных данных:

    filter_input()

    Например:
    $query = filter_input(
      INPUT_GET,
      'q',
      FILTER_SANITIZE_STRING,
      FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK
    );


    См. подробнее Очищающие фильтры.
    Ответ написан
    Комментировать
  • Как правильно посчитать количество одинаковых значений в массиве сохранить их число, и удалить их?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Я бы сделал с промежуточным массивом, где ключи – встреченные значения user:
    function mergeCount($arr) {
    
    	$keys = [];
    	foreach($arr as $item) {
    		$id = $item['id'];
    		$user = $item['user'];
    
    		if( isset( $keys[ $user])) {
    			$keys[ $user]['count']++;
    		} else {
    			$keys[$user] = [
    				'id' => $id,
    				'count' => 1
    			];
    		}
    	}
    	
    	$result = [];
    	foreach($keys as $user=>$item) {
    		$result[] = [
    			'id' => $item['count'] > 1 ? $item['count'] : $item['id'],
    			'user' => $user
    		];
    	}
    	
    	return $result;
    }

    Тест
    $data = [
    	['id'=>367, 'user'=>'text'],
    	['id'=>370, 'user'=>'text'],
    	['id'=>432, 'user'=>'text1'],
    	['id'=>234, 'user'=>'text33'],
    	['id'=>264, 'user'=>'text33'],
    ];	
    $a = mergeCount($data);
    print_r($a);
    Результат теста
    Array
    (
        [0] => Array
            (
                [id] => 2
                [user] => text
            )
    
        [1] => Array
            (
                [id] => 432
                [user] => text1
            )
    
        [2] => Array
            (
                [id] => 2
                [user] => text33
            )
    )
    Ответ написан
    1 комментарий
  • Как обрезать число до первой цифры после запятой больше 0?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. Рассматривать число как строку.
    2. Найти позицию первого не-ноля после десятичной точки.
    3. Взять строку до неё, включительно.
    p.s. решать вступительные / с собеседования / конкурсные задачи самостоятельно.

    Upd. Если точно на вход будут только числа (0..1), можно так:
    substr($n,0,3 + ceil(-log10(abs($n))) - abs(floor($n)) - 1)
    Ответ написан
    1 комментарий
  • VK API: php-скрипт возвращает ошибку. В чем проблема?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    "message" надо с маленькой буквы.

    У вас сейчас "Message" => $text,
    Ответ написан
    Комментировать
  • Что не так с php-скриптом для VK API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Разбирайте ответ от ВК, вполне возможно, что там содержится описание ошибки.

    Вместо
    printf('Success');
    exit;


    надо что-то типа
    $decoded = json_decode($query);
    if(!$decoded) {
      printf("ВК вернул невообразимую фигню: %s", $query);
    }
    else if( $decoded->error) {
      printf("Ошибка %d: %s\n", $decoded->error->error_code, $decoded->error->error_msg);
    } else if( $decoded->response) {
      printf("Пост опубликован с id %s\n", $decoded->response);
    }
    exit();


    Upd. возможно, дело в размещаемом сообщении и сurl. Попробуйте вместо CURLOPT_POSTFIELDS => array( ...
    сделать так:
    CURLOPT_POSTFIELDS     =>  http_build_query( array( ... ))
    Ответ написан
    Комментировать
  • Что лучше использовать для авторизации пользователей cookie или сессии?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сессии чаще всего держатся на cookie: с каждым запросом браузер передает куку с идентификатором сессии, и php вытаскивает из своего хранилища – файлов, Redis, базы данных, как настроете – сессионные данные для этого id.

    Т.е. различие в том, где хранить сами данные сессии: на сервере или на клиенте.

    Всё, что приходит с клиента можно подделать. Поэтому лучше использовать сессии.
    Ответ написан
    3 комментария
  • Как в результат массива foreach добавить число?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Из исходного массива взять только значения ключей, добавить туда $Element, после этого отсортировать и вывести:
    <?php
    $Element = 400;
    $keys = array_keys(
      $arResult['DISPLAY_PROPERTIES']['OTHER_COLORS']['LINK_ELEMENT_VALUE']
    );
    
    array_push($keys, $Element);
    
    sort($keys, SORT_NUMERIC);
    
    foreach($keys AS $intCurColorKey) {
    	echo( $intCurColorKey);
    }
    Ответ написан
    Комментировать
  • Как добавить часть одной страницы PHP в другую?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Изолируйте получение таблицы в отдельный файл / класс / функцию.

    Например:
    Пусть будет функция, на выходе которой html готовой таблицы. Файл getDataFromAPI.php содержит одноименную функцию getDataFromAPI().

    И в index.php и в new.php включайте этот файл:
    require_once('getDataFromAPI.php');
    Получайте html таблицы и вставляйте в нужном месте документа:
    <?php
    $table_html = getDataFromAPI();
    echo $table_html;
    ?>


    Ещё б кэшировать, наверное, хорошо.
    Ответ написан
    Комментировать
  • Как генерировать 5 случайных паролей на php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Ещё одна функция пусть принимает параметром требуемое число паролей и дёргает вашу исходную функцию столько раз:
    function generate_n_passwords($n) {
    	$result = array();
    	while($n--) {
    		array_push( $result, generate_password());
    	}
    	return $result;
    }
    
    $myFivePasswords = generate_n_passwords(5);
    Ответ написан
    Комментировать
  • Где достать либу для склонения слов и приведение их к числу?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если вам просто нужно правильно склонять слова, в зависимости от числа, то это всего несколько строк (на разных ЯП). На PHP:
    /**
     * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
     * param  $number Integer Число на основе которого нужно сформировать окончание
     * param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
     *         например array('яблоко', 'яблока', 'яблок')
     * return String
     */
    function getNumEnding($number, $endingArray)
    {
        $number = $number % 100;
        if ($number>=11 && $number<=19) {
            $ending=$endingArray[2];
        }
        else {
            $i = $number % 10;
            switch ($i)
            {
                case (1): $ending = $endingArray[0]; break;
                case (2):
                case (3):
                case (4): $ending = $endingArray[1]; break;
                default: $ending=$endingArray[2];
            }
        }
        return $ending;
    }
    Ответ написан
    1 комментарий
  • Offline версия веб-сайта?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Может, задача про service worker?

    На Хабре: Web-приложения в режиме offline. ServiceWorker и C...
    Ответ написан
    Комментировать