Kode:
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1"));
print_r(search($arr, 'name', 'cat 1'));
Keluaran:
Array
(
[0] => Array
(
[id] => 1
[name] => cat 1
)
[1] => Array
(
[id] => 3
[name] => cat 1
)
)
Jika efisiensi penting, Anda dapat menulisnya sehingga semua panggilan rekursif menyimpan hasilnya dalam $results
array sementara yang sama daripada menggabungkan array, seperti:
function search($array, $key, $value)
{
$results = array();
search_r($array, $key, $value, $results);
return $results;
}
function search_r($array, $key, $value, &$results)
{
if (!is_array($array)) {
return;
}
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
search_r($subarray, $key, $value, $results);
}
}
Kuncinya ada yang search_r
mengambil parameter keempat dengan referensi daripada nilai; ampersand &
sangat penting.
FYI: Jika Anda memiliki versi lama dari PHP maka Anda harus menentukan bagian pass-by-referensi dalam panggilan untuk search_r
bukan di deklarasi. Artinya, baris terakhir menjadi search_r($subarray, $key, $value, &$results)
.
$key
tidak ada dalam array? Bukankah lebih baik melakukannyaif (array_key_exists($key, $array) && $array[$key] == $value) {
?$value
yang mananull
dan fungsinya tidak berfungsi ...array empty
... Bagaimana cara membuat array walaupun$value
=null
? sukasearch($array, 'id', null)
?Bagaimana dengan versi SPL saja? Ini akan menghemat beberapa ketikan:
Apa yang hebat adalah bahwa pada dasarnya kode yang sama akan beralih melalui direktori untuk Anda, dengan menggunakan RecursiveDirectoryIterator alih-alih RecursiveArrayIterator. SPL adalah raketnya.
Satu-satunya kesal tentang SPL adalah bahwa itu didokumentasikan dengan buruk di web. Tetapi beberapa buku PHP membahas detail yang berguna, khususnya Pro PHP; dan Anda mungkin dapat mencari info lebih lanjut di google.
sumber
Ref: http://php.net/manual/en/function.array-filter.php
sumber
Kembali untuk memposting pembaruan ini bagi siapa saja yang memerlukan tip optimasi untuk jawaban ini, khususnya jawaban hebat John Kugelman di atas.
Fungsi yang diposkannya berfungsi dengan baik, tetapi saya harus mengoptimalkan skenario ini untuk menangani 12.000 hasil baris. Fungsi ini mengambil 8 detik abadi untuk melewati semua catatan, waaaaaay terlalu lama.
Saya hanya perlu fungsi untuk BERHENTI mencari dan kembali ketika kecocokan ditemukan. Yaitu, jika mencari customer_id, kami tahu kami hanya memilikinya di resultset dan begitu kami menemukan customer_id dalam array multidimensi, kami ingin kembali.
Ini adalah versi fungsi ini yang dioptimalkan dengan kecepatan (dan banyak disederhanakan), untuk siapa saja yang membutuhkan. Tidak seperti versi lain, itu hanya dapat menangani hanya satu kedalaman array, tidak berulang dan tidak menggabungkan beberapa hasil.
Ini menurunkan tugas untuk mencocokkan 12 000 catatan menjadi 1,5 detik. Masih sangat mahal tetapi jauh lebih masuk akal.
sumber
Peningkatan kecil ke versi cepat.
sumber
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:
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:
dan menerapkan antarmuka dan fungsi komparator kustom untuk mengurutkan dan menemukannya:
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).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 =)
sumber
Ini solusinya:
sumber
sumber
http://snipplr.com/view/51108/nested-array-search-by-value-or-key/
sumber
sumber
Saya membutuhkan sesuatu yang serupa, tetapi untuk mencari array multidimensi berdasarkan nilai ... Saya mengambil contoh John dan menulis
Saya harap ini membantu seseorang :)
sumber
Ini adalah fungsi yang direvisi dari yang diposting John K. ... Saya hanya perlu mengambil kunci spesifik dalam array dan tidak ada yang di atasnya.
sumber
Dan versi lain yang mengembalikan nilai kunci dari elemen array di mana nilai ditemukan (tidak ada rekursi, dioptimalkan untuk kecepatan):
Terima kasih untuk semua yang memposting di sini.
sumber
sumber
Jika Anda ingin mencari berbagai tombol, ini bagus
Kunci tidak akan menimpa karena setiap set kunci => nilai akan berada dalam array terpisah di array yang dihasilkan.
Jika Anda tidak ingin kunci duplikat, gunakan yang ini
sumber