@nevesomostjke

Вывести данные функции, каким образом?

Всем привет.
Нужна помощь. Кто поможет решить скину на карточку на кофе. :)

Итак, гружу данные с одной букмекерской конторы, через RollingCurl , это такая старенькая и простая библиотека, которая позволяет сделать за раз очень много запросов к сайту и не уйти в блек лист за мини ддос.

Вот код моего скрипта:
<?php

    // Модуль получения данных с xstavka

    require __DIR__ . '/lib/RollingCurl.php';
    require __DIR__ . '/lib/Request.php';

    // Получаем список всех матчей лайва
    $ch = curl_init("https://1xstavka.ru/LiveFeed/Get1x2_VZip?count=1000&mode=4&top=true&partner=5");
    $fp = fopen('data/xstavka_list.json', "w");

    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    curl_exec($ch);
    if(curl_error($ch)) {
        fwrite($fp, curl_error($ch));
    }

    curl_close($ch);
    fclose($fp);

    // Получаем данные по каждому матчу
    $json = file_get_contents('data/xstavka_list.json');
    $ids = json_decode($json, true);

    $rc = new \RollingCurl\RollingCurl();
    $rc->window_size = 20; // Количество одновременных соединений

    foreach ($ids['Value'] as $value) {     
        $rc->get('https://1xstavka.ru/LiveFeed/GetGameZip?id='.$value['I']); // Формируем очередь запросов  
    }
    
    $result = array();
    $rc->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) { 
    $t = json_decode($request->getResponseText());

        foreach($t as $key=>$value) {
           $new[$key]['ID'] = $value->I;  
        }
        print_r($t);
    });
    
    $rc->execute(); // Запускаем


Задача такая:
1. Получить данные в массивах JSON
2. Разобрать каждый и сделать свой массив, вида:
Array
[0] => Array
.....ID
.....Name и т.д.
Array
[1] => Array
.....ID
.....Name и т.д.
и т.д.

Для меня это кажется просто. Но, я столкнулся одной неприятной проблемой. Для вывода данных используется объект, setCallback, и это кажется, цикл. Например, я получаю 10 JSON массивов и на экране в print_r($t) я увижу 10 массивов. Выведенных не разом, а циклом. Причем, я вижу их каждый раз новым массивом. Я имею ввиду, не построчно с номерами ключей, а вот так:
Array (
)
Array (
)

Вопрос, как соединить массивы воедино и обработать результаты? Array_merge, array_values, array_columns - не работают, либо я их неправильно применил. Не знаю. Но я пробовал уже всё. Проблема в том, на мой взгляд, что я пытаюсь их получить из внешней функции.
Заранее спасибо за помощью.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 1
@tempick
Если я правильно понял, то функция в setCallback() вывзывается N раз. Внутри функции, где у вас print_r() - записывайте в $result.
$result = array();
    $rc->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) { 
    $t = json_decode($request->getResponseText());

        foreach($t as $key=>$value) {
           $new[$key]['ID'] = $value->I;  
        }
        print_r($t);
    });
Замените на
$result = []; //забудьте про array(), это очень старая фигня
    $rc->setCallback(function(\RollingCurl\Request $request, \RollingCurl\RollingCurl $rollingCurl) { 
    $t = json_decode($request->getResponseText());
        $new = []; //не забудьте объявить $new
        foreach($t as $key=>$value) {
           $new[$key]['ID'] = $value->I;  
        }
        $result[] = $new; //в массив $result мы добавляем массив $new
        //print_r($t);
       return $result;
    });

$arr = $rs->execute();
print_r($arr);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы