首页 > 解决方案 > 从作为对象元素的数组中删除元素

问题描述

我正在研究一个过滤系统来过滤掉菜单上显示的食物。菜单集合中的每个文档都包含类别的名称(或课程,如果你愿意的话)和一组食物。

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

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,
        }
    ]
}

问题是在它发现非素食食品并将其取消设置后,它会停止循环。我不知道为什么会这样。

谢谢任何回答的人:)

标签: php

解决方案


在将 JSON 解码为数组后,true您可以过滤并仅返回等于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]);
    }
}

推荐阅读