解决此代码时遇到问题。这些是数组
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
答案 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/>';
});
}
}
}