Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Удалить похожие объекты?

#php #массивы #объекты


Массив:
$objects = array(
    (object)array('name'=>'Stiven','age'=>25,'variant'=>(object)array('surname'=>'Sigal')),
    (object)array('name'=>'Michael','age'=>30,'variant'=>(object)array('surname'=>'Jackson')),
    (object)array('name'=>'Brad','age'=>35,'variant'=>(object)array('surname'=>'Pit')),
    (object)array('name'=>'Jolie','age'=>35,'variant'=>(object)array('surname'=>'Pit')),
);
echo "
";
print_r($objects);

Как удалить объекты, которые имеют одинаковые variant->surname и age? Точнее не удалить,
а оставить один из них, т.е. чтобы таких одинаковых элементов не было в массиве.    


Ответы

Ответ 1



отсортировать с помощью ф-ии usort() и собственной ф-ии, сравнивающей по полям variant->surname и age. Тогда объекты с одинаковыми значениями точно будут подряд; пробежаться array_filter() и ф-ей, сохраняющей статически предыдущие значения variant->surname и age, с тем, чтобы вернуть true только, если значения изменились. Upd. для ленивых: работающий пример.

Ответ 2



тупо перебором: бежим по массиву, если элемент первый, то копируем элемент проверяем наличие элемента в новом массиве если нет, копируем элемент и бежим дальше если да, то просто бежим дальше в заключение делаем unset() исходного массива, если он не нужен В результате будем иметь массив без дублей

Ответ 3



array_unique(),array_walk(), array_map(), array_filter()

Ответ 4



Прошу прощение за некропост(нашёл его через гугл) Мой вариант решения той же проблемы: /** * Вернёт только те объекты из массива $bad, которые уникальны по признаку $property * @param array $bad * @param string $property */ function array_object_unique($bad,$property) { foreach ($bad as $k1 => $a) { foreach ($good as $k2 => $g) { if ($a->$property == $g->$property) { continue(2); } } $good[] = $a; } return $good; } Хотя вариант ув. @sergiks тоже хороший, запустить его в контексте класса не удалось. P.s. Между прочим этот же алгоритм предложил ув.@akalend

Ответ 5



Пришел к такому решению: $tmp = array(); foreach ($objects as $item=>$object) { $tmp[$object->variant->surname][$object->age] = $object; } print_r($tmp); Все бы хорошо, да вот только как это переделать в прежний массив пока не знаю. (думаюю...) Если у кого есть идеи, плыз хелп.

Комментариев нет:

Отправить комментарий