Я придумал несколько другое, я думаю, более надежный вариант.
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) для его замены.
Я не знаю, как это работает на больших наборах данных.
Какое у вас определение «отличное»? Если «отличная» противоположность ссылочного равенства, то просто передается в «true», как это сделает третий параметр. – Jon
Значит, это будет работать с объектами в массиве? – gorgi93
Для некоторого определения «работа». Вам нужно дать более подробную информацию, чтение ума сложно. – Jon