У меня есть ошибка в моем коде, но решение зарыто глубоко в возврате JSON
Есть массив [17], я должен пройти через
foreach ($arr['data'][0]['likes']['data'] as $liker){
echo '<img src="'.$liker['profile_picture'].'" /></br>';
echo '<p> '.$liker['username'].'</p></br>';
}
Прекрасно работает для одного, но
for($i = 0; $i < sizeof($arr['data'][]); $i++){
echo '<img src="'.$arr['likes']['data']['profile_picture'].'" /></br>';
echo '<p> '.$liker['username'].'</p></br>';
}
имеет менее желаемые результаты.
Fatal error: Cannot use [] for reading in /var/www/localhost/htdocs/instagram2.php on line 68
или если я удалю [], я получаю "undefined" "нравится".
Как правильно прокручивать подмассиву JSON?
Вы ошибаетесь, вы приближаетесь к foreach
for
сравнению с foreach
. В foreach текущий элемент во время итерации автоматически присваивается $liker
, однако ничего не происходит в for
. Вы только увеличиваете значение $i
.
/// @shaddy has said, this is the correct way to access the array size
/// it is more optimal to calculate it outside of the loop.
$len = sizeof($arr['data']);
/// with a for loop, you have to use $i to calculate the item
for($i = 0; $i < $len; $i++){
$item = $arr['data'][$i];
/// and then access each of the subitems inside $item
...
}
Но у вас также есть другие проблемы. Кажется, вы пытаетесь вывести изображение каждого из профилей profile_pictures для символов; но это также массив данных. В первом примере вы непосредственно переходите через этот массив, так что все работает. В вашей второй, однако, вы только зацикливаете контейнерный массив, а не список символов. Чтобы заставить это работать, у вас должен быть второй цикл:
$len = sizeof($arr['data']);
/// with a for loop, you have to use $i to calculate the item
for($i = 0; $i < $len; $i++){
$item = $arr['data'][$i];
/// best to check for existence before accessing to avoid errors
if ( !empty($item['likes']['data']) ) {
$likers = $item['likes']['data'];
$len2 = sizeof($likers);
/// step each of the likers
for($k = 0; $k < $len2; $k++){
$liker = $likers[$k];
if ( !empty($liker['profile_picture']) ) {
echo '<img src="'.$liker['profile_picture'].'" /></br>';
}
/// the username field is also part of the user array inside item
if ( !empty($liker['username']) ) {
echo '<p> '.$liker['username'].'</p></br>';
}
}
}
}
Однако все это выглядит довольно сложно, я обычно не использую for
циклов в php, foreach
имеет гораздо более приятный интерфейс для работы и предназначен для работы с массивами:
foreach ( $arr['data'] as $i => $item ) {
if ( !empty($item['likes']['data']) ) {
foreach ( $item['likes']['data'] as $k => $liker ) {
if ( !empty($liker['profile_picture']) ) {
echo '<img src="' . $liker['profile_picture'] . '" /></br>';
}
if ( !empty($liker['username']) ) {
echo '<p> ' . $liker['username'] . '</p></br>';
}
}
}
}
Конечно, вы, возможно, просто хотели пропустить массив likers, как в первом примере, чтобы сделать это с помощью for
вас просто нужно:
$likers = $arr['data'][0]['likes']['data'];
$len = sizeof($likers);
for( $i = 0; $i < $len; $i++ ){
echo '<img src="' . $likers[$i]['profile_picture'] . '" /></br>';
echo '<p> ' $likers[$i]['username'] . '</p></br>';
}
Существует также еще один оговорка, о которой нужно знать, и это приведет к сбою некоторых из вышеперечисленных фрагментов, если это неверно. Все приведенные выше коды всегда работают с массивами, поэтому массив $arr
должен содержать только массивы. Однако в вашем наборе данных отображается смесь массивов и объектов. При работе с объектами в PHP вам нужно использовать другой аксессор.
Поскольку я не могу понять, как вы загружаете свой JSON, вам трудно посоветовать, поскольку в зависимости от способа объекты могут быть преобразованы в массивы. Все ваши примеры обрабатывают каждую часть вашей структуры как массив, и именно поэтому я принял то же самое в приведенном выше.
Однако стандартным способом было бы использовать json_decode
который должен/должен был сохранить разницу между массивом и объектом по умолчанию. Это означает, что когда бы там не было объекта, вам нужно будет использовать $obj → prop
а не $obj['prop']
, поэтому мой предпочтительный пример выше будет выглядеть так:
foreach ( $arr['data'] as $i => $item ) {
if ( !empty($item->likes['data']) ) {
foreach ( $item->likes['data'] as $k => $liker ) {
if ( !empty($liker->profile_picture) ) {
echo '<img src="' . $liker->profile_picture . '" /></br>';
}
if ( !empty($liker->username) ) {
echo '<p> ' . $liker->username . '</p></br>';
}
}
}
}
Также, если вы предпочитаете работать только с массивами, вы можете использовать что-то вроде этого:
https://coderwall.com/p/8mmicq/php-convert-mixed-array-objects-recursively
Ну $ arr ['data'] [] неверный способ ссылаться на значение данных массива, которое является правильным, $ arr ['data']
for($i = 0; $i < sizeof($arr['data']); $i++){
foreach ($arr['data'][$i]['likes']['data'] as $liker) {
echo '<img src="'.$liker['profile_picture'].'" /></br>';
echo '<p> '.$liker['username'].'</p></br>';
}
}
Подробнее о массивах можно узнать здесь http://php.net/manual/en/language.types.array.php.
; $i < sizeof($arr['data'][0]);