• Как вывести часть данных из json при помощи php?

    @qfake
    Не самое крутое в мире решение, но из него понятно, как оно работает.
    $json = 'твой json из примера';
    $array = json_decode($json, true);
    
    	foreach ($array['data'] as $item) {
    		$sites = $item['sites'];
    		
    		foreach ($sites as $site) {
    			if ($site['site_key'] === 'betfair') {
    				$item['h2h'] = $site['odds']['h2h'];
    			}
    		}
    		$result[] = [
    			'sport_key' => $item['sport_key'],
    			'teams' => $item['teams'],
    			'h2h' => isset($item['h2h']) ? $item['h2h'] : '',
    			];
    		}
    Ответ написан
    9 комментариев
  • Вывод вложенного массива из многомерного массива?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    В самом низу написал — зачем такой код писать не нужно...

    Готовый код под вашу задачу:
    <?php
    
    $input = '{"success":true,"data":[{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Jeonbuk Hyundai Motors","Suwon Samsung Bluewings"],"commence_time":1588932000,"home_team":"Jeonbuk Hyundai Motors","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[1.75,3.85,3.7]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[1.74,3.8,3.65]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[1.87,3.96,3.5]}},{"site_key":"betfair","site_nice":"Betfair","last_update":1588281947,"odds":{"h2h":[1.68,1.28,1.25],"h2h_lay":[85.0,85.0,85.0]}},{"site_key":"paddypower","site_nice":"Paddy Power","last_update":1588281989,"odds":{"h2h":[1.67,4.2,3.6]}}],"sites_count":5},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Sangju Sangmu FC","Ulsan Hyundai FC"],"commence_time":1589000400,"home_team":"Ulsan Hyundai FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[3.85,1.88,3.3]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[3.8,1.85,3.25]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[3.76,1.92,3.5]}}],"sites_count":3},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Daegu FC","Incheon United"],"commence_time":1589009400,"home_team":"Incheon United","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.23,2.95,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.2,2.9,3.2]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[2.28,2.98,3.3]}}],"sites_count":3},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["Sangju Sangmu FC","Seongnam FC"],"commence_time":1589018400,"home_team":"Sangju Sangmu FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.38,2.75,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.35,2.7,3.15]}}],"sites_count":2},{"sport_key":"soccer_korea_kleague1","sport_nice":"K League 1","teams":["FC Seoul","Gangwon FC"],"commence_time":1589095800,"home_team":"Gangwon FC","sites":[{"site_key":"unibet","site_nice":"Unibet","last_update":1588281960,"odds":{"h2h":[2.38,2.75,3.2]}},{"site_key":"sport888","site_nice":"888sport","last_update":1588282210,"odds":{"h2h":[2.35,2.7,3.15]}},{"site_key":"onexbet","site_nice":"1xBet","last_update":1588282134,"odds":{"h2h":[2.42,2.84,3.2]}}],"sites_count":3}]}';
    $data = json_decode($input, true);
    
    function grabBookerData(array $data, string $bookerName): array {
        return array_map(function(array $item) use ($bookerName) {
            // Собираем результирующий объект события
            $event             = new \stdClass();
            $event->sport_nice = $item['sport_nice'] ?? null;
            $event->teams      = $item['teams'] ?? [];
        
            // Из данных по разным букмекерам оставляем h2h, который нам нужен
            $bookersData = array_column($item['sites'], null, 'site_key');
            $event->h2h  = $bookersData[$bookerName]['odds']['h2h'] ?? [];
            
            return $event;
        }, $data['data'] ?? []);
    }
    
    var_dump(grabBookerData($data, 'unibet')); // итоговый набор данных

    sandbox.onlinephpfunctions.com/code/6cb94c1070692d...

    Зачем не нужно писать такой код:
    Такого плана данные лучше пропускать через сериалайзер, а потом просто фильтрануть в результирующих объектах (или просто достать) нужные данные.
    Плюс использования сериалайзеров — не нужно писать код выше, а нужно только писать свои объекты в уже нужном для вас формате. И потом данные маппить на эти объекты через сериалайзеры, тем самым не заплетаться в исходных данных.

    Сериалайзеры на PHP:
    Fractal (рекомендую)
    Symfony Serializer
    Zend Serializer
    JMS Serializer — его многие ругают за неторопливость и монструозность, но он довольно функциональный и забирает на себя кучу телодвижений, я бы делал с ним. Он становится небольшой проблемой, когда десятки и тысячи операций идут за некоторое непозволительное число серверов/времени.
    Ответ написан
    5 комментариев