2015-09-22 4 views
1

Недавно я задал вопрос о том, как разобрать этот канал JSON. Был дан ответ, но он также представил еще одну проблему. Эхо выплескивает повторяющиеся записи для каждого игрока в фиде. Я не уверен, почему это происходит, и я надеюсь, что кто-то может мне помочь.Duplicates in Parsed JSON

Вот мой код:

$url  = file_get_contents("http://www.nfl.com/liveupdate/game-center/2015091700/2015091700_gtd.json"); 
$json  = json_decode($url, true); // 'true' makes data an array 
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($json)); 
$player  = array(); 

foreach($iterator as $key=>$value) { 
    $player[$key] = $value; 

    echo $player['name'] . ' ' . $player['att'] . ' ' . $player['cmp'] . ' ' . $player['yds'] . ' ' . $player['tds'] . ' ' . $player['fgm'] . ' ' . $player['fga'] . '<br>'; 
} 

Это JSON:

{ 
    "2015091700":{ 
     "home":{ 
     "abbr":"KC", 
     "to":0, 
     "stats":{ 
      "passing":{ 
       "00-0023436":{ 
        "name":"A.Smith", 
        "att":25, 
        "cmp":16, 
        "yds":191, 
        "tds":0, 
        "ints":2 
       } 
      }, 
      "rushing":{ 
       "00-0026213":{ 
        "name":"J.Charles", 
        "att":21, 
        "yds":125, 
        "tds":1 
       } 
      } 
     } 
     } 
    } 
} 

Это дает мне дублирует. Смотри ниже.

A.Smith 
A.Smith 25 
A.Smith 25 16 
A.Smith 25 16 191 
A.Smith 25 16 191 0 
A.Smith 25 16 191 0 
A.Smith 25 16 191 0 
A.Smith 25 16 191 0 
J.Charles 25 16 191 0 
J.Charles 21 16 191 0 
J.Charles 21 16 125 0 
J.Charles 21 16 125 1 
J.Charles 21 16 125 1 
J.Charles 21 16 125 1 
J.Charles 21 16 125 1 
J.Charles 21 16 125 1 

Я хотел бы получить уникальные результаты для каждого игрока.

A.Smith должен быть A.Smith 25 16 191 0 2 и J.Charles должен быть J.Charles 21 125 1 вместо того, что вы видите выше.

+0

какой результат вы хотите? – harrrrrrry

+0

Мне хотелось бы, чтобы статистика каждого игрока отражала фид. Итак, A.Smith 25 16 191 0 и J.Charles 21 125 1. Я буду устанавливать каждое значение как переменную, а затем вставлять ее в таблицу базы данных. Я обновил свой вопрос, включив JSON. – localhost

ответ

1

Код на самом деле не создает дубликаты, вы просто распечатываете каждый прерывистый результат. Фактически, цикл переписывает данные для существующих ключей на каждой итерации. Это будет работать, если у вас есть только данные для одного игрока, но может привести к неожиданным (неправильным) результатам в этом случае с несколькими игроками.

Быстрое и несколько грязное решение заключается в сохранении и сбросе при запуске нового плеера. Здесь мы предполагаем, что ключ «имя» всегда присутствует и всегда является первой записью.

$url  = file_get_contents("http://www.nfl.com/liveupdate/game-center/2015091700/2015091700_gtd.json"); 
$json  = json_decode($url, true); // 'true' makes data an array 
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($json)); 
$players = array(); 
$player  = false; 

foreach ($iterator as $key => $value) { 
    // The key 'name' marks the start of a new player 
    if ($key == 'name') { 
     // If we were already processing a player, save it 
     if (is_array($player)) { 
      $players[] = $player; 
     } 
     // Start a new player 
     $player = array(); 
    } 
    // If we are processing a player, save the values 
    if (is_array($player)) { 
     $player[$key] = $value; 
    } 
} 
// Don't forget the last player 
$players[] = $player; 

// Output the resulting players 
print_r($players); 

// Or, in your desired output format 
// Will give a ton of E_NOTICES on dev setups! 
foreach($players as $player) { 
    echo $player['name'] . ' ' . $player['att'] . ' ' . $player['cmp'] . ' ' . $player['yds'] . ' ' . $player['tds'] . ' ' . $player['fgm'] . ' ' . $player['fga'] . '<br>'; 
} 

Было бы чище на самом деле получить данные из разобранного массива непосредственно, но это требует четко определенного и известного формата для JSON.

+0

Это прекрасно работает. Огромное спасибо. Ваше объяснение также приветствуется. – localhost