Prestare attenzione agli algoritmi di ricerca lineare (i precedenti sono lineari) in array multidimensionali in quanto hanno una complessità composta in quanto la profondità aumenta il numero di iterazioni richieste per attraversare l'intero array. Per esempio:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
impiegherebbe al massimo 200 iterazioni per trovare quello che stai cercando (se l'ago fosse a [100] [1]), con un algoritmo adatto.
Gli algoritmi lineari in questo caso eseguono su O (n) (ordina il numero totale di elementi nell'intero array), questo è scarso, un milione di voci (ad esempio un array 1000x100x10) richiederebbe in media 500.000 iterazioni per trovare l'ago. Inoltre cosa succederebbe se decidessi di cambiare la struttura del tuo array multidimensionale? E PHP darebbe il via a un algoritmo ricorsivo se la tua profondità fosse superiore a 100. L'informatica può fare di meglio:
Laddove possibile, utilizzare sempre oggetti anziché matrici multidimensionali:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
e applica un'interfaccia e una funzione di confronto personalizzate per ordinare e trovarle:
interface Comparable {
public function compareTo(Comparable $o);
}
class MyObject implements Comparable {
public function compareTo(Comparable $o){
...
}
}
function myComp(Comparable $a, Comparable $b){
return $a->compareTo($b);
}
È possibile utilizzare uasort()
per utilizzare un comparatore personalizzato, se ti senti avventuroso, dovresti implementare le tue raccolte per i tuoi oggetti che possano ordinarli e gestirli (estendo sempre ArrayObject per includere almeno una funzione di ricerca).
$arrayObj->uasort("myComp");
Una volta che sono ordinati (uasort è O (n log n), che è buono quanto supera i dati arbitrari), la ricerca binaria può eseguire l'operazione nel tempo O (log n), cioè un milione di voci richiede ~ 20 iterazioni per ricerca. Per quanto ne so, la ricerca binaria del comparatore personalizzato non è implementata in PHP ( array_search()
usa un ordinamento naturale che funziona su riferimenti a oggetti e non sulle loro proprietà), dovresti implementarlo come faccio io.
Questo approccio è più efficiente (non esiste più una profondità) e, soprattutto, universale (supponendo che si imponga la comparabilità mediante le interfacce) poiché gli oggetti definiscono il modo in cui vengono ordinati, in modo da poter riciclare il codice all'infinito. Molto meglio =)
$key
non esiste nell'array? Non sarebbe meglio fareif (array_key_exists($key, $array) && $array[$key] == $value) {
?