Удаление всех элементов массива, если элемент в подмассиве уже существует в другом элементе - PullRequest
0 голосов
/ 30 января 2019

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

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

Мне нужно удалить весь элемент массива, если идентификатор уже существует, в этом примере мне нужно удалить EITHER array [0] или array [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.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

$arr = array_values(array_column($arr, Null, "id"));
0 голосов
/ 30 января 2019

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

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