2013-06-21 5 views
7

Может ли функция in_array сравнить объекты?Сравнение PHP-объекта in_array?

Например, у меня есть массив объектов, и я хочу добавить их отчетливо в другой массив. Можно ли проверить, был ли объект уже добавлен так:

in_array($distinct, $object); 

или есть ли другой способ?

+0

Какое у вас определение «отличное»? Если «отличная» противоположность ссылочного равенства, то просто передается в «true», как это сделает третий параметр. – Jon

+0

Значит, это будет работать с объектами в массиве? – gorgi93

+1

Для некоторого определения «работа». Вам нужно дать более подробную информацию, чтение ума сложно. – Jon

ответ

11

Функция in_array не может сравнивать объекты.

Вы должны создать уникальные пары ключ-значение из ваших объектов и только сравнить эти ключи при вставке нового объекта в свой последний массив.

Если предположить, что каждый объект имеет уникальный id свойства, возможное решение будет:

$unique_objects = array(); 

// $data represents your object collection 
foreach ($data as $item) { 
    if (!array_key_exists($item->id, $unique_objects)) { 
     $unique_objects[$item->id] = $obj; 
    } 
} 
+0

Это действительно сработало ... XD – gorgi93

+0

lol, что? $ idem не является переменной в любом месте, и не является $ obj? Как это проголосовало 13 раз? –

+0

Хорошая точка. Я обновил ответ, чтобы исправить опечатку '$ idem'. Предположение с этим примером кода состоит в том, что '$ obj' просто представляет существующую переменную, которая должна быть однозначно добавлена ​​в массив' $ unique_objects'. – ukliviu

9

Вы можете использовать строгое сравнение: пример

in_array($object, $array, TRUE); 

Использование:

$a = new stdClass(); 
$a->x = 42; 

$b = new stdClass(); 
$b->y = 42; 

$c = new stdClass(); 
$c->x = 42; 

$array = array($a,$b); 

echo in_array($a, $array, true); // 1 
echo in_array($b, $array, true); // 1 
echo in_array($c, $array, true); // 
0

Если «STRICT» является «FALSE», сравнение производится путем преобразования в строку elem энтов. Поэтому, если вы переопределите магическую функцию __toString, вы должны быть доступны для сравнения элементов объектов.

1

Я не знаю, связано ли это с новой версией PHP, но в моем проекте, используя PHP 5.3.16 на Ubuntu 12.04, это сработало. Он нашел объект иглы в моем массиве объектов. Я также дважды проверял загрузку другого объекта того же класса и проверку его на содержимое массива, которое не содержало этот объект, и оно действительно вернулось.

Да, in_array может сравнивать объекты.

0

Я придумал несколько другое, я думаю, более надежный вариант.

function array_add_unique(&$array, $new, $test, $cb) { 
    if(is_array($array) && count($array)>0) { 
    for($i = 0; $i < count($array); $i++) { 
     if($array[$i][$test] == $new[$test]) { 
     $do = $cb($array[$i], $new); 
     if(is_bool($do) && $do) { $array[$i] = $new; } 
     else if(!is_bool($do)) { $array[$i] = $do; } 
     return; 
     } 
    } 
    } 
    array_push($array, $new); 
} 

Преимущество этого решения заключается в том, что он включает определяемый пользователем обратный вызов для обработки столкновений. Когда вы добавляете уникальные объекты, вы можете сохранить свойства как из старого, так и из нового объекта.

Обратный вызов, который может быть анонимной функцией, получает как новый объект, так и существующий объект, поэтому пользователь может иметь собственный расчет. Верните true, чтобы просто заменить существующий объект или вернуть новый объект (non-bool) для его замены.

Я не знаю, как это работает на больших наборах данных.

0

Существует множество способов сделать это, как вы можете видеть. Я просто подумал, что добавлю еще один. Я не знаю почему, но при работе с объектными массивами мне нравится использовать функции массива, которые используют обратные вызовы.

Если ваши объекты имеют какие-либо идентификатор, который они должны, если вы хотите, чтобы проверить их дублирования, следующий будет работать:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) { 
    return $uniqueObject->id == $object->id 
}); 

if (!$found) { 
    $uniqueObjects[] = $object; 
} 

$object является объектом, который вы ищете, и $uniqueObjects является массив объектов, которые вы ищете, чтобы увидеть, существует ли он. Просто сопоставьте uniqueObject и объект с идентификационным свойством, например id.

Смежные вопросы