PHP: функция группировки массива объектов по значению

Я работаю с многомерным массивом. Как удалить дубликаты по значению? В следующем массиве [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'));