Uważaj na algorytmy wyszukiwania liniowego (powyższe są liniowe) w tablicach wielowymiarowych, ponieważ mają złożoną złożoność, ponieważ jej głębokość zwiększa liczbę iteracji wymaganych do przejścia całej tablicy. Na przykład:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
zajęłoby co najwyżej 200 iteracji, aby znaleźć to, czego szukasz (gdyby igła miała wartość [100] [1]), przy użyciu odpowiedniego algorytmu.
Algorytmy liniowe w tym przypadku działają w O (n) (uporządkuj całkowitą liczbę elementów w całej tablicy), jest to słabe, milion wpisów (np. Tablica 1000x100x10) wymagałoby średnio 500 000 iteracji, aby znaleźć igłę. Co by się stało, gdybyś zdecydował się zmienić strukturę swojej wielowymiarowej tablicy? A PHP wykopałby algorytm rekurencyjny, gdyby twoja głębokość była większa niż 100. Informatyka może zrobić lepiej:
Tam, gdzie to możliwe, zawsze używaj obiektów zamiast tablic wielowymiarowych:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
i zastosuj niestandardowy interfejs i funkcję komparatora, aby je posortować i znaleźć:
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);
}
Możesz użyć uasort()
niestandardowego komparatora, jeśli masz ochotę na przygodę, powinieneś zaimplementować własne kolekcje dla swoich obiektów, które mogą je sortować i zarządzać nimi (zawsze rozszerzam ArrayObject, aby zawierał przynajmniej funkcję wyszukiwania).
$arrayObj->uasort("myComp");
Po posortowaniu (uasort to O (n log n), co jest tak dobre, jak w przypadku dowolnych danych), wyszukiwanie binarne może wykonać operację w czasie O (log n), tj. Milion wpisów zajmuje tylko ~ 20 iteracji Szukaj. O ile wiem, wyszukiwanie binarne niestandardowego komparatora nie jest zaimplementowane w PHP (array_search()
używa naturalnego porządku, który działa na odwołaniach do obiektów, a nie na ich właściwościach), musiałbyś to zaimplementować samodzielnie, tak jak ja.
To podejście jest bardziej wydajne (nie ma już głębi) i, co ważniejsze, uniwersalne (zakładając, że wymuszasz porównywalność za pomocą interfejsów), ponieważ obiekty definiują sposób ich sortowania, dzięki czemu można nieskończenie powtarzać kod. Znacznie lepiej =)
$key
nie istnieje w tablicy? Czy nie byłoby lepiejif (array_key_exists($key, $array) && $array[$key] == $value) {
?