У меня есть многомерный массив, состоящий из продуктов. Каждый подмассив имеет тип продукта. 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.
Вы, очевидно, выбираете все продукты из базы данных, но вместо этого вы должны выбрать отдельные типы продуктов из таблицы продуктов.






Если вы также получите ключ каждого элемента, вы можете удалить элемент, если это необходимо, внутри цикла foreach:
$ids = [];
foreach ($products as $key => $product {
$id = $product->getproductType()->getid();
if (in_array($id, $ids)) {
unset($product[$key];
} else {
$ids[] = $id;
}
}
Спасибо, кажется, это работает хорошо и означает, что у меня не так много переменных. Спасибо :)
Нет необходимости в цикле, вы можете использовать array_column, чтобы сделать массив ассоциативным, что удалит все дубликаты.
Затем используйте array_values, чтобы снова проиндексировать массив.
$arr = array_values(array_column($arr, Null, "id"));
Думаю с некоторыми уровнями объектов так не получится
@splash58 это работало каждый раз, когда я пробовал. Может быть, есть какие-то массивы, на которых он не будет работать, но я пока не встречал.
если я правильно понимаю структуру - sandbox.onlinephpfunctions.com/code/…
Пожалуйста, покажите правильный пример массива, предпочтительнее уже как код PHP с возможностью копирования и вставки.
0 => product [вроде как не имеет особого смысла, у вас либо цифровой ключ, либо строковый.