Я работаю над системой фильтров, чтобы отфильтровывать продукты, отображаемые в меню. Каждый документ в коллекции меню содержит название категории (или курса, если хотите) и набор блюд.
Я пробовал различные решения, такие как следующий код, который приближает меня к желаемому результату.
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]);
}
}
Чтобы это работало, вам нужно изменить $v['vegetarian'] === true; на $v['vegetarian'] === "true";
То же самое для версии foreach
Обернул первое решение в цикл foreach (поскольку мне нужно было зациклить его для каждой категории), и это сработало просто отлично. Большое спасибо!
@RiggsFolly: Есть ли причина, по которой решение foreach лучше?
Я не говорил, что foreach лучше!
@RiggsFolly: Ха-ха, извини, тогда моя ошибка :-)
@RiggsFolly: Почему? Они логические, а не строки.
Нет, они должны быть строками, так как JSON поддерживает только строки.
у вас есть лишняя скобка в вашей петле? Кроме того, лучше использовать
== falseвместо сравнения строки IMO.