Achten Sie auf lineare Suchalgorithmen (die oben genannten sind linear) in mehrdimensionalen Arrays, da diese die Komplexität erhöhen, da ihre Tiefe die Anzahl der Iterationen erhöht, die zum Durchlaufen des gesamten Arrays erforderlich sind. Z.B:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
würde höchstens 200 Iterationen benötigen, um mit einem geeigneten Algorithmus zu finden, wonach Sie suchen (wenn die Nadel bei [100] [1] wäre).
Lineare Algorithmen arbeiten in diesem Fall bei O (n) (Reihenfolge der Gesamtzahl der Elemente im gesamten Array). Dies ist schlecht. Eine Million Einträge (z. B. ein Array von 1000 x 100 x 10) würden durchschnittlich 500.000 Iterationen benötigen, um die Nadel zu finden. Was würde auch passieren, wenn Sie die Struktur Ihres mehrdimensionalen Arrays ändern würden? Und PHP würde einen rekursiven Algorithmus starten, wenn Ihre Tiefe mehr als 100 wäre. Informatik kann es besser machen:
Verwenden Sie nach Möglichkeit immer Objekte anstelle mehrdimensionaler Arrays:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
und wenden Sie eine benutzerdefinierte Komparatorschnittstelle und -funktion an, um sie zu sortieren und zu finden:
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);
}
Sie können uasort()
einen benutzerdefinierten Komparator verwenden. Wenn Sie sich abenteuerlustig fühlen, sollten Sie Ihre eigenen Sammlungen für Ihre Objekte implementieren, die sie sortieren und verwalten können (ich erweitere ArrayObject immer um mindestens eine Suchfunktion).
$arrayObj->uasort("myComp");
Sobald sie sortiert sind (uasort ist O (n log n), was so gut ist, wie es über beliebige Daten geht), kann die binäre Suche die Operation in O (log n) -Zeit ausführen, dh eine Million Einträge dauert nur ~ 20 Iterationen Suche. Soweit mir bekannt ist, ist die benutzerdefinierte Komparator-Binärsuche in PHP nicht implementiert (array_search()
verwendet eine natürliche Reihenfolge, die auf Objektreferenzen und nicht auf deren Eigenschaften funktioniert). Sie müssten dies selbst implementieren, wie ich es tue.
Dieser Ansatz ist effizienter (es gibt keine Tiefe mehr) und vor allem universell (vorausgesetzt, Sie erzwingen die Vergleichbarkeit mithilfe von Schnittstellen), da Objekte definieren, wie sie sortiert werden, sodass Sie den Code unbegrenzt recyceln können. Viel besser =)
$key
nicht ausgegeben, wenn er nicht im Array vorhanden ist? Wäre es nicht besser zu tunif (array_key_exists($key, $array) && $array[$key] == $value) {
?