PhP howto sizeof (JSON: массив [])

0

У меня есть ошибка в моем коде, но решение зарыто глубоко в возврате JSON

https://api.instagram.com/v1/users/self/media/liked?access_token=207436640.c57b856.b0a8944d1e0c4e70a6ec581679c656b5

Есть массив [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?

  • 0
    ; $i < sizeof($arr['data'][0]);
  • 0
    существует двойной индекс $
Теги:

2 ответа

0
Лучший ответ

Вы ошибаетесь, вы приближаетесь к 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

0

Ну $ 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.

  • 0
    Он работает с «лайками» для ($ i = 0; $ i <sizeof ($ arr ['data']); $ i ++) {echo '<div class = "dibBoxesWithOuterShadows "> </br>'; echo '<img src = "'. $ arr ['likes'] ['data'] ['profile_picture']. '" /> </br>'; echo '<p>'. $ liker ['username']. '</ p> </br>'; echo '</ div>'; }
  • 0
    Примечание: неопределенный индекс: лайки в ~ 70
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню