Удаление элемента из массива, который является элементом объекта

Я работаю над системой фильтров, чтобы отфильтровывать продукты, отображаемые в меню. Каждый документ в коллекции меню содержит название категории (или курса, если хотите) и набор блюд.

Я пробовал различные решения, такие как следующий код, который приближает меня к желаемому результату.

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

Проблема в том, что после того, как он обнаружит невегетарианский продукт питания и отключит его, он перестанет зацикливаться. Я понятия не имею, почему это происходит.

Спасибо всем, кто ответит :)

у вас есть лишняя скобка в вашей петле? Кроме того, лучше использовать == false вместо сравнения строки IMO.

treyBake 01.05.2019 17:16

Спасибо, я удалил лишнюю скобку, а также полностью обновил код.

Andrew 01.05.2019 17:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После декодирования 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";

RiggsFolly 01.05.2019 17:30

То же самое для версии foreach

RiggsFolly 01.05.2019 17:33

Обернул первое решение в цикл foreach (поскольку мне нужно было зациклить его для каждой категории), и это сработало просто отлично. Большое спасибо!

Andrew 01.05.2019 17:35

@RiggsFolly: Есть ли причина, по которой решение foreach лучше?

Andrew 01.05.2019 17:36

Я не говорил, что foreach лучше!

RiggsFolly 01.05.2019 17:37

@RiggsFolly: Ха-ха, извини, тогда моя ошибка :-)

Andrew 01.05.2019 17:39

@RiggsFolly: Почему? Они логические, а не строки.

AbraCadaver 01.05.2019 19:27

Нет, они должны быть строками, так как JSON поддерживает только строки.

RiggsFolly 01.05.2019 21:31

Другие вопросы по теме