PhP howto sizeof(JSON:array [])

时间:2015-01-11 08:29:46

标签: php json

我的代码中有一个错误,但解决方案深埋在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

或如果我删除[],我会'未定义'喜欢'。

如何正确循环JSON子阵列?

2 个答案:

答案 0 :(得分:0)

好的arr [&#39;数据&#39;] []无效的方式来引用数组的数据值正确的是$ arr [&#39; data&#39;]

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

答案 1 :(得分:0)

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>';
      }
    }
  }
}

但是上面所有看起来都很复杂,我通常不会在php中使用for循环,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