如何显示第二个多维数组中的json值?

时间:2019-07-28 02:19:54

标签: php arrays json

解决此代码时遇到问题。这些是数组

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => delux
            [price] => 213
            [description] => 
            [tv] => 0
            [breakfast] => 0
            [park] => 0
            [wifi] => 0
            [ac] => 0
            [occupancy] => 
            [size] => 
            [view] => 
            [service] => 
            [terrace] => 0
            [pickup] => 0
            [internet] => 0
            [gym] => 0
            [note] => 
            [room_details] => {"img":["images/logo2.png","images/logo.png"]}
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => hjghj
            [price] => 234
            [description] => 
            [tv] => 0
            [breakfast] => 0
            [park] => 0
            [wifi] => 0
            [ac] => 0
            [occupancy] => 
            [size] => 
            [view] => 
            [service] => 
            [terrace] => 0
            [pickup] => 0
            [internet] => 0
            [gym] => 0
            [note] => 
            [room_details] => 
        )

)

我想回显room_details下的每个图像,以这样显示

  

images / logo2.png
  images / logo.png

这是我的代码

    foreach ($roomandsuits as $i => $item) { 

      $array_links = json_decode($item->room_details, true); { 

        foreach  ($array_links as $key => $value) {   

          foreach ($value as $content) { 

       echo $content; 

       }           
       }     
      } 
     }

第三行出现错误,并显示如下

images/logo2.png
images/logo.png
  

警告:在第10行的C:\ xampp \ htdocs \ resort \ modules \ mod_roomandsuits \ tmpl \ default.php中为foreach()提供了无效的参数   images / logo.png

3 个答案:

答案 0 :(得分:0)

在将数组传递给foreach之前,您需要检查是否正在使用数组。

$roomandsuits中的第二个元素有一个空的'room_details'。无论如何,您都将其放入json_decode()并立即传递到foreach。

$array_links = json_decode($item->room_details, true); // there was a misplaced opening brace here previously...

if (!is_array($array_links)) {
    continue;
}

foreach ($array_links as $key => $value) {   

答案 1 :(得分:0)

您的深json字符串在结构上有所不同。解码第一个会生成一个包含两个字符串的img键控数组。第二个具有null或空字符串(您的帖子没有为我们显示)。您最终的foreach()正在尝试迭代一个不可迭代的数据类型-这就是问题的原因。


我可能建议您进行重构,以避开如此多的foreach()结构...

在将输入数组转换为数组之后,可以将room_details列与array_column()隔离。

重要的是,不仅要检查子数组是否为空,还要检查它实际上是否包含img键。如果是这样,我的脚本将假定它是一个索引数组。

然后迭代json字符串的集合,对其进行解码,然后解压缩(使用splat运算符...)并将其推入结果数组。

构建完结果数组后,请用<br>内嵌元素。

代码:(Demo

$array = [
    (object)[
        'id' => 1,
        'name' => 'delux',
        'room_details' => '{"img":["images/logo2.png","images/logo.png"]}'
    ],
    (object)[
        'id' => 2,
        'name' => 'hjghj',
        'room_details' => ''
    ]
];

$images = [];
foreach (array_column((array)$array, 'room_details') as $json) {
    $obj = json_decode($json);
    if (isset($obj->img)) {
        array_push($images, ...$obj->img);
    }
}

echo implode("\n", $images);  // implode with <br> for html linebreaks

输出:

images/logo2.png
images/logo.png

使用array_column()的一个优点是,如果其中一个对象中由于某种原因不存在room_details,则将在循环过程中将其省略。这样可以避免在尝试对room_details isset()进行解码之前对其进行检查。

答案 2 :(得分:0)

尝试以下代码。我在评论中添加了详细信息。

foreach ($roomandsuits as $i => $item) { 

        if($item->room_details){  //check if value of $item->'room_details' not null

            $room_details = json_decode($item->room_details, true); //decode the json data

            if(!empty($room_details)){  //Check if room_details is not empty array
                $room = $room_details['img'];
                array_walk($room, function($value){  //using array_walk gate the value of room_details
                    echo $value .'<br/>';
                });

            }
        }

    }

DEMO