Удаление целых элементов массива, если элемент в подмассиве уже существует в другом элементе

У меня есть многомерный массив, состоящий из продуктов. Каждый подмассив имеет тип продукта. productType находится в массиве внутри массива Product, так что;

 0 => product [
  productType [
  id: 2
  ]
 ]
 1 => product [
  productType [
  id: 1
  ]
 ]
 2 => product [
  productType [
  id: 2
  ]
 ]
]

Мне нужно удалить весь элемент массива, если идентификатор уже существует, в этом примере мне нужно будет удалить ЛИБО массив [0] или массив [2], это не имеет значения, поскольку мне нужен только productType[id] для заполнения поля .

Я сделал цикл, который создает массив уже существующих идентификаторов, но он включает в себя создание 2 новых массивов:

    //This works but seems a bit inefficient
    $productFinal = [];
    $ids = [];
    foreach ($products as $product) {
        if (!in_array($product->getproductType()->getid(), $ids)) {
            $productFinal[] = $product;
        }
        $ids[] = $product->getproductType()->getid();
    }

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

Пожалуйста, покажите правильный пример массива, предпочтительнее уже как код PHP с возможностью копирования и вставки. 0 => product [ вроде как не имеет особого смысла, у вас либо цифровой ключ, либо строковый.

04FS 30.01.2019 09:59

Вы, очевидно, выбираете все продукты из базы данных, но вместо этого вы должны выбрать отдельные типы продуктов из таблицы продуктов.

u_mulder 30.01.2019 10:01
Стоит ли изучать 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
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если вы также получите ключ каждого элемента, вы можете удалить элемент, если это необходимо, внутри цикла foreach:

$ids = [];
foreach ($products as $key => $product {
   $id = $product->getproductType()->getid();
   if (in_array($id, $ids)) {
      unset($product[$key];
   } else {
      $ids[] = $id;
   }
}

Спасибо, кажется, это работает хорошо и означает, что у меня не так много переменных. Спасибо :)

Twisterr1000 30.01.2019 10:54

Нет необходимости в цикле, вы можете использовать array_column, чтобы сделать массив ассоциативным, что удалит все дубликаты.
Затем используйте array_values, чтобы снова проиндексировать массив.

$arr = array_values(array_column($arr, Null, "id"));

Думаю с некоторыми уровнями объектов так не получится

splash58 30.01.2019 10:14

@splash58 это работало каждый раз, когда я пробовал. Может быть, есть какие-то массивы, на которых он не будет работать, но я пока не встречал.

Andreas 30.01.2019 10:16

если я правильно понимаю структуру - sandbox.onlinephpfunctions.com/code/…

splash58 30.01.2019 10:22

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