essere attento di algoritmi di ricerca lineari (Sono lineare) in più matrici tridimensionali come sono composti complessità sua profondità aumenta il numero di iterazioni necessarie per attraversare l'intero array. Ad esempio:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
avrebbe preso i migliori 200 iterazioni per trovare quello che state cercando (se l'ago erano a [100] [1]), con un algoritmo adatto.
algoritmi lineari in questo caso eseguono su O (n) (ordine numero totale di elementi in intero array), questo è povero, un milione di voci (ad esempio una matrice 1000x100x10) occorrerebbero mediamente 500.000 iterazioni per trovare l'ago. Inoltre cosa succederebbe se decidessi di cambiare la struttura del tuo array multidimensionale? E PHP sarebbe calci fuori un algoritmo ricorsivo se la profondità è stato più di 100. Informatica può fare meglio:
Se possibile, utilizzare sempre oggetti invece di più array bidimensionali:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
e applicare un comparatore personalizzato l'interfaccia e la funzione di ordinare e li trovano:
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()
di utilizzare un comparatore personalizzato, se vi sentite avventurosi è necessario implementare una tua raccolta per gli oggetti che possono ordinare e gestire t orlo (estendo sempre ArrayObject per includere almeno una funzione di ricerca).
$arrayObj->uasort("myComp");
Una volta che essi sono ordinati (uasort è O (n log n), che è buono come si ottiene oltre dati arbitrari), ricerca binaria può fare l'operazione in O (log n), vale a dire un milione le voci richiedono solo ~ 20 iterazioni per la ricerca. Per quanto ne so, la ricerca binaria personalizzata non è implementata in PHP (array_search()
utilizza un ordinamento naturale che lavora sui riferimenti agli oggetti e non sulle loro proprietà), dovresti implementarlo come me.
Questo approccio è più efficiente (non esiste più una profondità) e, soprattutto, universale (presupponendo che si imponga la comparabilità utilizzando le interfacce) poiché gli oggetti definiscono il modo in cui sono ordinati, in modo da poter riciclare il codice all'infinito. Molto meglio =)
@JohnKugelman Wont la "efficiente" risposta errore se '$ key' non esiste in l'array? Non sarebbe meglio fare 'if (array_key_exists ($ key, $ array) && $ array [$ key] == $ valore {{? – Chausser
@JohnKugelman Questa funzione funziona bene ma a volte ho il mio '$ valore' che è' null' e la funzione non funziona ... 'array empty' ... Come avere un array anche se' $ value' = 'null'? come 'search ($ array, 'id', null)'? – Zagloo