Mi è venuta in mente un'opzione un po 'diversa, penso più robusta.
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);
}
Il vantaggio di questa soluzione è che include un callback definibile dall'utente per gestire le collisioni. Quando aggiungi oggetti unici, potresti voler preservare le proprietà sia del vecchio che del nuovo oggetto.
Il callback, che può essere una funzione anonima, riceve sia il nuovo oggetto che l'oggetto esistente in modo che l'utente possa disporre di un calcolo personalizzato. Restituire true per sostituire semplicemente l'oggetto esistente o restituire un nuovo oggetto (non bool) per sostituirlo.
Tuttavia, non conosco le prestazioni di questo su grandi set di dati.
Qual è la tua definizione di "distinto"? Se "distinto" è l'opposto dell'uguaglianza di riferimento, allora basta passare in 'true' come il terzo parametro lo farà. – Jon
Quindi questo funzionerà con gli oggetti nell'array? – gorgi93
Per alcune definizioni di "lavoro". Devi dare maggiori dettagli, la lettura della mente è difficile. – Jon