Я придумав дещо інший, я думаю більш надійний, варіант.
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), щоб
замінити його.
Я не знаю продуктивності цього на великих наборів даних,
хоча.