Я работаю с многомерным массивом. Как удалить дубликаты по значению? В следующем массиве [0], [2] и [5] имеют тот же [ID]. Есть ли функция, которая удалит любые повторяющиеся массивы на основе определенного значения? В этом случае я хотел бы удалить массив [2] и массив [5], так как они имеют тот же [ID], что и массив [0].
Благодарим вас за любую информацию, которую вы можете иметь.
Array ( [0] => stdClass Object ( [d] => 2010-10-18 03:30:04 [ID] => 9 ) [1] => stdClass Object ( [d] => 2010-10-18 03:30:20 [ID] => 4 ) [2] => stdClass Object ( [d] => 2010-11-03 16:46:34 [ID] => 9 ) [3] => stdClass Object ( [d] => 2010-11-02 03:19:14 [ID] => 1 ) [4] => stdClass Object ( [d] => 2010-05-12 04:57:34 [ID] => 2 ) [5] => stdClass Object ( [d] => 2010-05-10 05:24:15 [ID] => 9 ) )
Один из способов сделать это: ( $old_array
– ваш массив, а $new_array
будет содержать новый, удаленные удалены, с помощью этого идентификатора)
$new_array = array(); foreach ($old_array as $item) if (!array_key_exists($item->ID, $new_array)) $new_array[$item->ID] = $item;
(Я не тестировал это, но он должен работать)
Вы можете сделать это с uuzo goodies :
$result = FluentArray::from($array)->uniqueBy('ID')->toArray();
См. http://ouzo.readthedocs.org/ru/latest/utils/fluent_array.html#uniqueby
Я думаю, что было бы проще прорисовать и построить новый массив. В цикле используйте array_key_exists (), чтобы определить, существует ли идентификатор уже в новом массиве, а если нет, добавьте элемент.
Это не многомерный массив, это массив объектов . Вы можете просто перебрать его (этот пример изменяет массив на месте):
$ids = array(); forach($array as $key=>$obj) { if(isset($ids[$obj->ID])) {//did we already encounter an object with this ID? unset($array[$key]); // if yes, delete this object } else { $ids[$obj->ID] = 1; // if not, add ID to processed IDs } }
с$ids = array(); forach($array as $key=>$obj) { if(isset($ids[$obj->ID])) {//did we already encounter an object with this ID? unset($array[$key]); // if yes, delete this object } else { $ids[$obj->ID] = 1; // if not, add ID to processed IDs } }
Вы также можете создать новый массив и добавить объекты в новый массив.
foreach ($array as $element) { foreach ($array as &$element2) { if ($element2->ID == $element->ID && $element2 != $element) { unset($element2); } } }
сforeach ($array as $element) { foreach ($array as &$element2) { if ($element2->ID == $element->ID && $element2 != $element) { unset($element2); } } }
Обратите внимание на цикл по ссылке во втором foreach.
Проверьте индексированную функцию от Nspl .
use function \nspl\op\propertyGetter; use function \nspl\a\indexed; $groupedById = indexed($objects, propertyGetter('id'));