2010-04-26 4 views
0

Я получаю JSON-кодированный вывод из API другой организации.Как работать с выходом JSON, который может быть массивом, или может быть значением

Во многих случаях выход может быть либо массивом объектов (если их много), либо объектом (если есть только один). Сейчас я пишу измученный код, как это:

if (is_array($json['candidateList']['candidate'][0])) { 
    foreach ($json['candidateList']['candidate'] as $candidate) { 
    // do something to each object 
    } 
} 
else { 
    // do something to the single object 
} 

Как я могу справиться с этим, так что «делать что-то» часть моего кода появляется только один раз и использует стандартный синтаксис?

ответ

2

Просто сделайте это массив, если это не так, - тогда продолжайте итерацию.

// Normalize response into an array 
if (!is_array($json['candidateList']['candidate'])) 
{ 
    $json['candidateList']['candidate'] = array($json['candidateList']['candidate']); 
} 

// Process data 
foreach ($json['candidateList']['candidate'] as $candidate) { 
    // do something to each object 
} 
2

Вы должны указать, кто подает фид, что он должен быть более последовательным :) в этом случае было бы целесообразно иметь массив, даже если есть только один кандидат, поэтому у вас будет только один элемент массив.

0

Если вы можете изменить апи, пойдите с ответом Яануса. В противном случае, возможно, напишите функцию, которая принимает значение, и возвращает либо значение (если это значение является массивом), либо одноэлементный массив, содержащий значение (если это не так).

2
<?php 

// When json is an object, convert to an array with a single member 
if (is_object($json)) $json = array($json); 

foreach ($json as $object) { 
    // do something to each object 
} 
1

Поместите код «сделать что-нибудь» в функцию, а затем вызовите функцию из обоих мест. Это имеет боковую выгоду от модуляции вашего кода.

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

(Примечание стороны: Я согласен с Jaanus Хорошо сформированный API будет возвращать список в обеих случаях, даже если список только один член длинный Для именно этой причины...)

Смежные вопросы