Почему foreach по объекту результатов не работает?

Я понимаю, что вопросов такого рода довольно много, но я не смог решить свою проблему, используя другие сообщения, поэтому я надеялся, что кто-то здесь сможет мне помочь.

У меня есть объект, который я получаю от API локального поиска Yahoo. Я передал результаты в json_decode() и сохранил результаты в $yahoo_json_decoded. Я могу получить данные из результатов, используя цикл for и выполнив следующие действия:

echo 'Name: ' . $yahoo_json_decoded->ResultSet->Result[$i]->Title . '<br />' ;

Но я не могу заставить foreach работать:

foreach($yahoo_json_decoded->ResultSet as $res=>$variable)
{
    $listingID = $yahoo_json_decoded->ResultSet[$res]->id ;
    echo $listingID;
}

Я мог бы просто зациклить данные и двигаться дальше, но я действительно хочу понять, почему foreach не работает.

Спасибо (проявить милосердие)

Кирк


person Kirk B    schedule 26.03.2013    source источник


Ответы (4)


Буквальная разница между двумя циклами

Цикл for в вашем фрагменте перебирает массив $yahoo_json_decoded->ResultSet->Result, а цикл foreach перебирает объект $yahoo_json_decoded->ResultSet.

Другими словами, в цикле for вы перебираете элементы массива, как и ожидали, тогда как в цикле foreach вы фактически перебираете < em>свойства объекта.

Демонстрация разницы

Например, для данного объекта:

$json = json_encode(array('result'=>array('apple','orange','lemon')));
$obj  = json_decode($json);

рассмотрим разницу между этим циклом:

for ($i=0; $i < count($obj->result); $i++) :
    echo $i.' - '.$obj->result[$i].' ';
endfor;

и этот цикл:

foreach ($obj as $key=>$val) :
    echo $key.' - ';
    var_dump($val);
endforeach;

Результат первого цикла будет:

0 - apple 1 - orange 2 - lemon

В то время как вывод второго будет:

result - array(3) { [0]=> string(5) "apple" [1]=> string(6) "orange" [2]=> string(5) "lemon" }

Увидите разницу в действии

person Boaz - CorporateShillExchange    schedule 26.03.2013
comment
Воаз, спасибо за подробное объяснение. Так было намного легче понять, что я делаю не так. - person Kirk B; 27.03.2013
comment
Боаз, честно говоря, я даже не заметил этого. Я думаю, когда вы думаете о других вещах, легко пропустить что-то прямо в лицо. Ответ принят. - person Kirk B; 28.03.2013

На основе $yahoo_json_decoded->ResultSet->Result[$i]->Title, который, как вы говорите, работает:

foreach($yahoo_json_decoded->ResultSet->Result as $index => $result)
{
   $listingID = $result->id ;
    echo $listingID;
}
person MichaelRushton    schedule 26.03.2013

Насколько я понимаю, вы должны делать

foreach($yahoo_json_decoded->ResultSet->Result as $key => $val) //(...)
person alxgb    schedule 26.03.2013

вам не хватает слоя структуры данных в вашем цикле foreach

foreach($yahoo_json_decoded->ResultSet->Result as $res=>$variable)
{
   $listingID = $variable->id ;
    echo $listingID;
}

по сравнению с вашим циклом for

for ($i = 0; $i <10; $i++)
$yahoo_json_decoded->ResultSet->Result[$i]->Title

таким образом

$i = $res
$variable = $yahoo_json_decoded->ResultSet->Result[$i]
person David Chan    schedule 26.03.2013
comment
Спасибо, Дэвид. Теперь я начинаю лучше понимать. - person Kirk B; 27.03.2013