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,
}
]
}
问题是在它发现非素食食品并将其取消设置后,它会停止循环。我不知道为什么会这样。
谢谢任何回答的人:)
解决方案
在将 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]);
}
}
推荐阅读
- java - 如何在 selenium webdriver (java) 中生成报告?
- android - android 可编辑 Baseurl 改造
- python - 如何将已生成的 XML 字符串附加到使用 minidom 生成的 XML 中?
- python - 如何以更好的优化方式计算 cross_val_score() 的平均值?
- ruby-on-rails - Rails:在不渲染页面的情况下发送 401 错误
- vaadin - 如何创建没有 POJO(动态列)的网格?
- typescript - 如何模拟cheerio.load().toArray().slice();
- c# - 如何在 WPF 中正确实现 VirtualizingWrapPanel
- javascript - 获取购物车产品的总价
- c++ - 警告:返回的与局部变量“x”相关的堆栈内存地址 [-Wreturn-stack-address]