从作为对象元素的数组中删除元素

时间:2019-05-01 15:13:56

标签: php

我正在研究一种过滤系统,以过滤掉菜单上显示的食物。菜单集合中的每个文档都包含类别的名称(如果需要,还包含课程)和一系列食品。

我尝试了各种解决方案,例如以下代码,使我更接近所需的输出。

foreach($menu as $category){

   foreach($category["fooditems"] as $fooditem){

       if ($fooditem["vegetarian"] == false){
                 if (($key = array_search($fooditem, (array) $category["fooditems"])) !== false) 
                    unset($category["fooditems"][$key]);        
    }
  }
}

之前:


{
    "category" : "Starters",
    "fooditems" : [ 
        {
            "name" : "No meat",
            "vegetarian" : true,

        }, 
        {
            "name" : "Horse Meat",
            "vegetarian" : false,
        }, 
        {
            "name" : "Some more meat",
            "vegetarian" : false,
        }
    ]
}

预计之后:


{
    "category" : "Starters",
    "fooditems" : [ 
        {
            "name" : "No meat",
            "vegetarian" : true,

        }
    ]
}

之后的实际情况:


{
    "category" : "Starters",
    "fooditems" : [ 
        {
            "name" : "No meat",
            "vegetarian" : true,

        }, 
        {
            "name" : "Some more meat",
            "vegetarian" : false,
        }
    ]
}

问题在于发现非素食食品并使其凝固后,它停止循环。我不知道为什么会这样。

感谢所有回答:)

的人

1 个答案:

答案 0 :(得分:0)

使用true将JSON解码为数组后,您可以过滤并仅返回等于true的值:

$menu['fooditems'] = array_filter($menu['fooditems'],
                                  function($v) {
                                      return $v['vegetarian'] === true;
                                  });

要使用循环,只需使用数组的完整路径跟踪键和unset

foreach($menu['fooditems'] as $key => $values) {
    if($values['vegetarian'] === false) {
        unset($menu['fooditems'][$key]);
    }
}