我的代码中有一个错误,但解决方案深埋在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
或如果我删除[],我会'未定义'喜欢'。
如何正确循环JSON子阵列?
答案 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