Hati-hati dengan algoritma pencarian linear (yang di atas adalah linear) dalam array beberapa dimensi karena mereka telah menambah kompleksitas karena kedalamannya meningkatkan jumlah iterasi yang diperlukan untuk melintasi seluruh array. Misalnya:
array(
[0] => array ([0] => something, [1] => something_else))
...
[100] => array ([0] => something100, [1] => something_else100))
)
akan membutuhkan paling banyak 200 iterasi untuk menemukan apa yang Anda cari (jika jarum berada di [100] [1]), dengan algoritma yang sesuai.
Algoritma linier dalam hal ini bekerja pada O (n) (memesan jumlah elemen dalam seluruh array), ini buruk, sejuta entri (mis. Array 1000x100x10) akan membutuhkan rata-rata 500.000 iterasi untuk menemukan jarum. Juga apa yang akan terjadi jika Anda memutuskan untuk mengubah struktur array multidimensi Anda? Dan PHP akan mengeluarkan algoritma rekursif jika kedalaman Anda lebih dari 100. Ilmu komputer dapat melakukan lebih baik:
Jika memungkinkan, selalu gunakan objek alih-alih array beberapa dimensi:
ArrayObject(
MyObject(something, something_else))
...
MyObject(something100, something_else100))
)
dan menerapkan antarmuka dan fungsi komparator kustom untuk mengurutkan dan menemukannya:
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);
}
Anda dapat menggunakan uasort()
untuk menggunakan komparator khusus, jika Anda ingin berpetualang Anda harus mengimplementasikan koleksi Anda sendiri untuk objek yang dapat mengurutkan dan mengelolanya (saya selalu memperluas ArrayObject untuk menyertakan fungsi pencarian setidaknya).
$arrayObj->uasort("myComp");
Setelah mereka diurutkan (uasort adalah O (n log n), yang sama baiknya dengan data yang sewenang-wenang), pencarian biner dapat melakukan operasi dalam waktu O (log n), yaitu satu juta entri hanya membutuhkan ~ 20 iterasi untuk Cari. Sejauh yang saya ketahui pencarian biner komparator kustom tidak diterapkan dalam PHP (array_search()
menggunakan pemesanan alami yang bekerja pada referensi objek bukan properti mereka), Anda harus mengimplementasikan ini sendiri seperti yang saya lakukan.
Pendekatan ini lebih efisien (tidak ada lagi kedalaman) dan yang lebih penting universal (dengan asumsi Anda menerapkan komparabilitas menggunakan antarmuka) karena objek menentukan bagaimana mereka diurutkan, sehingga Anda dapat mendaur ulang kode tanpa batas. Jauh lebih baik =)
$key
tidak ada dalam array? Bukankah lebih baik melakukannyaif (array_key_exists($key, $array) && $array[$key] == $value) {
?