vorontsov_aa
@vorontsov_aa
интересуюсь веб-разработкой

Как из массива объектов удалить дублирующиеся объекты?

Есть массив вида
array(8122) {
  [0]=>
  object(DonateOperation)#8127 (4) {
    ["id"]=>
    int(0)
    ["price"]=>
    string(10) " 100  ₽ "
    ["name"]=>
    string(20) "Константин"
    ["date"]=>
    string(10) "26.11.2020"
  }
  [1]=>
  object(DonateOperation)#4 (4) {
    ["id"]=>
    int(1)
    ["price"]=>
    string(13) " 1 000  ₽ "
    ["name"]=>
    string(31) "Дарья"
    ["date"]=>
    string(10) "26.11.2020"
  }
..

В этом массиве встречаются дублирующиеся объекты (имеют все одинаковые свойства).
Как корректнее оставить в массиве только уникальные объекты? array_unique для массивов объектов не работает.
  • Вопрос задан
  • 440 просмотров
Решения вопроса 2
@Stalinko
PHP'шник и фрилансер до мозга костей
Обновлённый ответ.

1. Можешь все объекты преобразовать в массивы без поля ID. Далее просто использовать array_unique($collection, SORT_REGULAR);

2. Можешь определить метод __toString() у класса DonateOperation. Как-нибудь так:

public function __toString(): string
{
    $attrs = (array)$this;
    unset($attrs['id']);
    return json_encode($attrs);
}


Тогда array_unique будет работать применительно к исходной коллекции объектов.

3. Брут-форс в лоб. Самый долгий способ. С небольшой оптимизацией:

$collection = [...]; //исходная коллекция объектов
$found = []; //коллекция найденных массивов для быстрой проверки
$unique = []; //результирующая коллекция

foreach ($collection as $item) {
    //преобразуем объект в массив без поля "id"
    $array = (array)$item;
    unset($array['id']);
    
    //ищем полученный массив в массиве $found
    if (!in_array($array, $found)) {
        $found[] = $array;
        $unique[] = $item;
    }
}
Ответ написан
@alexalexes
Можно удалить id из элемента массива (точнее из копии элемента), оставшиеся свойства засериализовать, от сериализации найти md5 хэш - это и будет ориентир для уникальности элемента.
$out_array = [];
foreach($donates as $donate)
{
   $donate_copy =  $donate; // копируем элемент массива
   unset( $donate_copy->id); // удаляем уникальное свойство из элемента
   $key = md5(serialize($donate_copy)); // получаем уникальный ключ по содержанию остальных свойств
   $out_array[$key] =  $donate; // добавляем исходный элемент в новый массив по уникальному ключу
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы