#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);
Все бы хорошо, да вот только как это переделать в прежний массив пока не знаю. (думаюю...)
Если у кого есть идеи, плыз хелп.
Комментариев нет:
Отправить комментарий