PHP: функция для группировки массива объектов по значению - PullRequest
3 голосов
/ 02 декабря 2010

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

)

Ответы [ 6 ]

5 голосов
/ 02 декабря 2010

Один из способов сделать это: ($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;

(я не проверялэто, но должно работать)

3 голосов
/ 08 января 2015

Вы можете сделать это с вкусностями узо :

$result = FluentArray::from($array)->uniqueBy('ID')->toArray();

См. http://ouzo.readthedocs.org/en/latest/utils/fluent_array.html#uniqueby

0 голосов
/ 29 декабря 2015

Проверка индексированная функция от Nspl .

use function \nspl\op\propertyGetter;
use function \nspl\a\indexed;

$groupedById = indexed($objects, propertyGetter('id'));
0 голосов
/ 02 декабря 2010
foreach ($array as $element) {
    foreach ($array as &$element2) {
        if ($element2->ID == $element->ID && $element2 != $element) {
            unset($element2);
        }
    }
}

Обратите внимание на цикл по ссылке во втором foreach.

0 голосов
/ 02 декабря 2010

Это не многомерный массив, это массив объектов .Вы можете просто зациклить его (этот пример изменяет массив на месте):

$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
    }
}

Вы также можете создать новый массив и добавить объекты в новый массив.

0 голосов
/ 02 декабря 2010

Я думаю, что было бы проще всего пройти и построить новый массив.В цикле используйте array_key_exists (), чтобы определить, существует ли идентификатор в новом массиве, и, если нет, добавить элемент.

...