PHP получить json, увеличить значение и собрать в массив

n1k.Sly

Постоялец
Регистрация
7 Сен 2009
Сообщения
97
Реакции
9
Всем добрый день, опять начну с того что я совсем нуб и учусь и вот столкнулся с очередной проблемой которую никак не могу решить, во всяком случае не могу понять как правильно сделать...

Есть json который выдает за раз не более скажем 100 объектов.
Есть возможность сделать запрос с параметром offset 100 т.е. соответственно будет получим в ответе еще 100 объектов.

Вот не могу понять каким образом нужно правильно собирать всё в кучу..

Т.е. методом тыка выяснил что максимальный offset идёт 9500 (выводит пустой ответ).
Каким методом можно реализовать чтобы скажем получаю ответ от json потом делается offset+100 и еще ответ и так до пустого ответа?

Пробовал делать Как-то так:
Код:
$i=0;
while ($i<=9500) {
$offset = '&offset='.$i;

$get_content = file_get_contents($url); 
(урл собирается нормально т.е. проверял цикл и он до 9500 постоянно мне увеличивает offset как задумано)

$i+=100;

}
$objson = json_decode($get_content);
var_dump($objson);

Но при таком варианте у меня он берёт первые 100 объектов, а дальнейшие запросы никак не добавляются...

Пробовал json_decode добавить в цикл после запроса к апи и сбор массива $arr[]=$objson;
но так же первые 100 объектов собирается, а дальше нет...

Подскажите куда копать, в гугле искал ничего похожего не смог найти..
 
Типа того:

PHP:
$i=0;
$tmpArr = [];
while ($i<=9500) {
$offset = '&offset='.$i;

$get_content = file_get_contents($url);

(урл собирается нормально т.е. проверял цикл и он до 9500 постоянно мне увеличивает offset как задумано)
$tmpArr[] = json_decode($get_content);
$i+=100;

}

echo "<pre>",var_dump($tmpArr),"</pre>";

собирать все джэйсоны надо внутри цикла
 
Если речь идет - передача данных между 2-мя PHP файлами - тот json тут вовсе не нужен.

если говорить про связку JS + PHP - то каким образом собираетесь передавать json??? не используя POST или GET????

Рабочий пример отправки POST / GET запроса на чистом JS + получение ответа от сервера Json и его разбор.
Думаю вопросов не должно возникнуть, в коментах все расписано подробнее некуда


HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script>
        /*
        ////// формы ***********
        document.forms - получаем массив формы с браузера
        .type - возвращает тип узла - div, input, button .....
        .nodeName - вернет input select, но лучше использовать .type
        .elements[i] - получаем элемент формы input .....
        .elements[i].name - получаем имя элемента формы
        .elements[i].value - получаем значение элемента формы

        ////// запросы **********
        var xhr = new XMLHttpRequest();          // Создание объекта для HTTP запроса.
        xhr.open("POST", "input.php", true); // открыли POST/GET запрос.   синхронный запрос true - останавливает скрипт до ответа сервера.
            POST запрос осылает POST и GET запрос одновременно.
            GET - отсылает только GET, можно отсылать без зголовка.
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // указали тип передаваемых данных, без залоговка запрос не отправится
        xhr.send(my_request); // отправили запрос на сервер
        xhr.responseText - ответ присланный сервером (json, text, html...)
        JSON.parse(xhr.responseText) - json ответ PHP преобразовали в ассоциативный массив JS

        ///// ответ от сервера ********
        xhr.onreadystatechange - функция срабатывает в момент изменения состояния загрузки странички текущей или странички запроса
            document.readyState - текущая страничка
            xhr.readyState - состояние загрузки странички запроса, возвращает одно из сдел значений:
                2 (loading) - Страница все еще загружается.
                3 (interactive) - частичная загрузка
                4 (complete) - страница загружена
             xhr.status   - возвращает статус запроса
                200 - запрос успешно получен
                201 - страничка создна успешно
                202 - код обработан сервером не верно (POST сформирован не правильно как пример)
                301 - 301 редирект
                302,307 - временный редирект
                304 - Вказує на те, що ресурс не був змінений з моменту останнього запиту.
                400 - Bad Request - запрос с синтаксической ошибкой
                401 - Запрос требует проверки подлинности пользователя. Ответ должен содержать поле WWW-Authenticate заголовок,
                403 - доступ запрещен
                404 - ресурс не существует или недоступен
                408 - превышен интервал ожидания запроса
                414 - превышена мах длинна uri запроса
                419 - закончилось время жизни сеанса
                500 - ошибка серевера
                509 - превышена максимальная нагрузка на сервер для пользователя

        */

window.onload = function ()
{
    // фомируем POST запрос из данных формы ***********
    function convert_forms_to_post_request (name)
    {
        var f = document.forms[name];
        if (!f) return;
        var count = 0; // счетчик используем для убирания лишнего & в конце запроса
        var rezult = ''; // записываем сюда финальный запрос POST
        for (var i = 0; i < f.elements.length; i++)
        {
            if ( f.elements[i].type == 'button') {continue;}

            if (count == 0)
            { rezult += f.elements[i].name + '=' + f.elements[i].value; count ++; }
            else
            { rezult += '&' + f.elements[i].name + '=' + f.elements[i].value; }
        }
        return (rezult);
    }
/*
    //// XMLHttpRequest POST ******** - получение html из файла
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "imput.html?a=hello&b=world", false);
    xhr.send();
    document.getElementById("output").innerHTML += 'XMLHttpRequest POST/GET' + "<br>" + xhr.responseText + "<br><br><br>";
*/
    function send_post_request (name)
    {
        // отправка POST в PHP ****************
        var xhr = new XMLHttpRequest(); // создали объект запроса
        xhr.open(/*"GET"*/"POST", "input.php", true); // открыли синхронный true POST запрос
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // указали тип передаваемых данных
        var my_request = convert_forms_to_post_request('MyAjaxForm'); // сформировали запрос с данных формы
        xhr.send(my_request); // отправили запрос на сервер

        // проверка, получил ли наш запрос сервер*****
        xhr.onreadystatechange = function ()
        {
            if (xhr.readyState == '4' && xhr.status == 200)
            {
                document.getElementById("output").innerHTML += 'Ответ сервера на наш запрос: ' + "<br>" + xhr.responseText + "<br><br>";

                var user = JSON.parse(xhr.responseText);

                document.getElementById("output").innerHTML += 'полученную строку распарсили через JSON.parse(xhr.responseText)' + "<br>";

                for (var i in user)
                {
                    document.getElementById("output").innerHTML += (i + '=' + user[i] + "<br>");
                }
            }
        }
    }
}

    </script>
</head>
<body>
<div id="output"></div>

<div style=" text-align: center; font-size: 16px; font-weight: bold;">Форма обратной связи</div>

<form name="MyAjaxForm" id="my_ajax_form" action="" method="post">
    <input placeholder="Имя"  type="text" name="my_ajax_form_name" value="My name"><br>
    <input placeholder="Телефон"  type="text" name="my_ajax_form_phone" value="Телефон"><br>
    <input placeholder="e-mail"  type="text" name="my_ajax_form_email" value="email адрес"><br>
    <input type="button" onclick="forma('MyAjaxForm')" id="submit_my_ajax_form" value="Отправить" />
</form>





</body>
</html>

PHP:
<?php
//print_r ($_REQUEST);

//echo json_encode($_GET, JSON_UNESCAPED_UNICODE);
//echo json_encode($_POST, JSON_UNESCAPED_UNICODE);

if (empty($_POST)) echo "<b>сервер получил пустую строку, вместо данных</b>";
else echo json_encode($_REQUEST, JSON_UNESCAPED_UNICODE);
?>
 
Последнее редактирование:
то каким образом собираетесь передавать json??? не используя POST или GET????
так у него file_get_contents($url) берет $урл и парсит содержимое с помощью json_decode()
Зачем ему формы?
 
так у него file_get_contents($url) берет $урл и парсит содержимое с помощью json_decode()
Зачем ему формы?
curl будет вполне достаточно.
Каким методом можно реализовать чтобы скажем получаю ответ от json потом делается offset+100 и еще ответ и так до пустого ответа?


Не совсем понимаю логику Вашего скрипта.

Но, если я все правильно понял:

1. имеется некий файл который делает выборку с базы данных c ограничением в 100 строк выборки - $url.
2. 2-й файл условно назовем index.php
Следовательно - нужно передать файлу $url сколько следует пропустить строк + сколько строк нам нужно Limit = 100.
Как пример:
PHP:
$i=0;
while ($i<=9500) {
$url = $url . '?offset='.$i . '&limit=100'; // добавили GET запрос

$get_content = file_get_contents($url);
(урл собирается нормально т.е. проверял цикл и он до 9500 постоянно мне увеличивает offset как задумано)

$i+=100;

}
$objson = json_decode($get_content);
var_dump($objson);
$url - скрипт знает что ему передают параметр начала выборки через GET запрос? $_GET


Либо скрипт $url, зачем то выбирает ВСЕ записи с базы данных, файл index.php - отсылает запрос в файл $url - делает выборку первых 100 строк, 2-й запрос, следующих 200 строк и т д. В результате получается, каждый раз, для выборки 100 строк идет выгрузка всех 9500 записей с базы + куча времени тратится на перебор 9500 записей в поисках нужных нам 100 записей.

2. передать параметры в файл выборки можно несколькими способами:
- через запись в базе данных
- через глобальную переменную
- через POST или GET c использованием формы или curl
- через ajax - если данные отправляются JS или jquery

ajax отсылает POST или GET запрос, но никак не json, для возврата ответа обратно в JS от PHP файла - достаточно сделать вывод echo нужных нам данных, либо преобразовать в массив json и вывести через echo - для простоты разбора в JS.

Если же оба файла PHP - как правило обмениваются POST запросами через curl, либо через глобальные переменные.
 
Последнее редактирование:
Вот не могу понять каким образом нужно правильно собирать всё в кучу..
Выше автор написал:
Следовательно - нужно передать файлу $url сколько следует пропустить строк + сколько строк нам нужно Limit = 100.
Я это понимаю как "нужно выбрать всё" а не "нужно выбрать Х строк, пропустив У строк".
ajax отсылает POST или GET запрос, но никак не json, для возврата ответа обратно в JS от PHP файла - достаточно сделать вывод echo нужных нам данных, либо преобразовать в массив json и вывести через echo - для простоты разбора в JS.
Автор ни слова не сказал про AJAX и JS.

n1k.Sly, вы можете привести пример данных, которые вы получаете от скрипта, к которому делаете запросы?
Пробовал json_decode добавить в цикл после запроса к апи и сбор массива $arr[]=$objson;
но так же первые 100 объектов собирается, а дальше нет...
По логике, оно должно было или последние сто выдать(если вместо $arr вывели $objson), или всё, но никак не первые сто.
 
Последнее редактирование:
Первое решение от Casper_R Отлично работает :).

Единственное получается многомерный массив в котором идёт по 100 объектов, но как по мне норм.


вы можете привести пример данных, которые вы получаете от скрипта, к которому делаете запросы?

Код:
98 =>
        array (size=15)
          'article' => int 10052
          'name' => string 'Подставка для планшета iPearl iBracket-Pro' (length=62)
          'full_name' => string 'Подставка для планшета, iPearl, iBracket-Pro, Чёрный' (length=78)
          'category' => int 3640
          'sort' => int 0
          'price1' => int 337
          'price2' => int 468
          'quantity' => string '>50' (length=3)
          'isnew' => int 0
          'ishit' => int 0
          'ispromo' => int 0
          'description' => string '<b>Подставка для планшета iPearl iBracket-Pro</b><br>
Благодаря маленькому размеру и функции складывания - подставка для смартфона iBracket - незаменимый аксессуар. Телефон можно легко установить на любую поверхность для удобного просмотра видео или чтения электронной почты.<br>
Особенности:<br>
'... (length=711)
          'brand' => string 'iPearl' (length=6)
          'weight' => string '0' (length=1)
          'images' =>
            array (size=2)
              0 => string 'https://img.site.ru/10052_1.jpg' (length=35)
              1 => string 'https://img.site.ru/10052_3.jpg' (length=35)

Вот так возвращает по 100 штук за запрос :)
 
Назад
Сверху