Çok boyutlu dizilerdeki doğrusal arama algoritmalarına (yukarıdakiler doğrusaldır) dikkat edin, çünkü derinliği tüm diziyi geçmek için gereken yineleme sayısını artırdığından karmaşık karmaşıklığa sahiptirler. Örneğin:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
uygun bir algoritma ile aradığınızı bulmak için (iğne [100] [1] 'de olsaydı) en fazla 200 yinelemeyi alırdı.
Bu durumda doğrusal algoritmalar O (n) 'de çalışır (dizideki tüm elemanların sıralı toplam sayısı), bu zayıftır, bir milyon giriş (örneğin 1000x100x10 bir dizi) iğneyi bulmak için ortalama 500.000 yineleme gerektirir. Ayrıca çok boyutlu dizinizin yapısını değiştirmeye karar verirseniz ne olur? Derinliğiniz 100'den fazla olsaydı PHP yinelemeli bir algoritmayı başlatırdı. Bilgisayar bilimi daha iyisini yapabilir:
Mümkün olduğunda, çok boyutlu diziler yerine her zaman nesneleri kullanın:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
ve bunları sıralamak ve bulmak için özel bir karşılaştırma arayüzü ve işlevi uygulayın:
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);
}
uasort()
Özel bir karşılaştırıcı kullanmak için kullanabilirsiniz, maceraperest hissediyorsanız, onları sıralayabilen ve yönetebilen nesneleriniz için kendi koleksiyonlarınızı uygulamalısınız (ArrayObject'i her zaman en azından bir arama işlevi içerecek şekilde genişletirim).
$arrayObj->uasort("myComp");
Bir kez sıralandıktan sonra (uasort, O (n log n) 'dir, ki bu, keyfi veriyi aşması kadar iyidir), ikili arama işlemi O (log n) zamanında yapabilir, yani bir milyon giriş yalnızca ~ 20 iterasyon alır arama. Özel karşılaştırıcı ikili aramanın PHP'de uygulanmadığını bildiğim kadarıyla ( array_search()
özelliklerinde değil nesne referanslarında çalışan doğal sıralama kullanır), bunu kendi kendinize uygulamanız gerekir.
Bu yaklaşım daha etkilidir (artık bir derinlik yoktur) ve daha da önemlisi evrenseldir (arayüzleri kullanarak karşılaştırılabilirliği zorunlu kıldığınızı varsayarsak), çünkü nesneler nasıl sıralanacaklarını tanımlar, böylece kodu sonsuza kadar geri dönüştürebilirsiniz. Çok daha iyi =)
$key
istemez misiniz? Yapmak daha iyi olmazif (array_key_exists($key, $array) && $array[$key] == $value) {
mı?