如果使用PHP从JSON数组中删除与特定条件匹配的对象,则会出现问题.代码正在引发错误



我有一个json数组,我需要循环遍历并删除所有库存为0的对象。

JSON-

[
{
"products": [
{
"title": "cars",
"stock": 0
},
{
"title": "bike",
"stock": 2
},
{
"title": "dog",
"stock": 0
},
{
"title": "cat",
"stock": 3
}
]
}
]

到目前为止,我有以下代码:

<?php
$str = '[{"products":[{"title":"cars","stock":0},{"title":"bike","stock":2},{"title":"dog","stock":0},{"title":"cat","stock":3}]}]';
$json_decoded = json_decode($str,true);
foreach($json_decoded as $index){
foreach(['products'] as $product_index => $product_data){
if($product_data['stock'] == 0){
unset($json_decoded[$index]['products'][$product_index]);
}
}
}
echo json_encode($json_decoded));
?>

这是可运行的狙击坑:http://sandbox.onlinephpfunctions.com/code/f5d3fb1c98c9cfba7f030c0605e138721bccc937

但我只收到错误:

Warning: Illegal string offset 'stock' in [...][...] on line 6
Warning: Illegal offset type in [...][...] on line 7

我在如何继续的问题上已经走到了死胡同,很明显我的代码有一个错误,但我不太熟悉JSON数组的功能。我需要删除库存为零的任何项目的父项。任何帮助都将不胜感激。

您的foreach循环有一个错误:

foreach($json_decoded as $index){                                 //<---- here
foreach(['products'] as $product_index => $product_data){     //<---- here
if($product_data['stock'] == 0){
unset($json_decoded[$index]['products'][$product_index]);   //<---- and here
}
}
}

应该是这样的:

foreach($json_decoded as $ind=>$data){ 
foreach($data['products'] as $product_index => $product_data){  
if($product_data['stock'] == 0){
unset($json_decoded[$ind]['products'][$product_index]);   
}
}
}

对于较短的版本,请尝试此操作:

foreach(array_keys(array_column($json_decoded[0]["products"],"stock"),0) as $no_stock){
unset($json_decoded[0]["products"][$no_stock]);
};

演示:https://3v4l.org/817Gc

最新更新