Fungsi panggilan balik array_filter()
hanya lewat dalam nilai-nilai array, bukan kunci.
Jika saya punya:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Apa cara terbaik untuk menghapus semua kunci $my_array
yang tidak ada dalam $allowed
array?
Output yang diinginkan:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
ini akan menghasilkan$b['bar']
benull
.Jawaban:
PHP 5.6 memperkenalkan parameter ketiga untuk
array_filter()
,flag
, bahwa Anda dapat mengatur untukARRAY_FILTER_USE_KEY
untuk menyaring oleh key bukan nilai:Jelas ini tidak seanggun
array_intersect_key($my_array, array_flip($allowed))
, tetapi memang menawarkan fleksibilitas tambahan untuk melakukan tes sewenang-wenang terhadap kunci, misalnya$allowed
dapat berisi pola regex bukan string biasa.Anda juga dapat menggunakan
ARRAY_FILTER_USE_BOTH
agar nilai dan kunci diteruskan ke fungsi filter Anda. Berikut adalah contoh yang dibuat berdasarkan yang pertama, tetapi perhatikan bahwa saya tidak akan merekomendasikan penyandian aturan penyaringan menggunakan$allowed
cara ini:sumber
array_intersect
Dengan
array_intersect_key
danarray_flip
:sumber
array_flip
? Cukup tentukan$allowed
kunci dengan:allowed = array ( 'foo' => 1, 'bar' => 1 );
Saya perlu melakukan hal yang sama, tetapi dengan
array_filter
tombol yang lebih kompleks .Begini cara saya melakukannya, menggunakan metode yang serupa.
Ini menghasilkan hasilnya:
sumber
Berikut ini adalah solusi yang lebih fleksibel menggunakan penutupan:
Output:
Jadi dalam fungsinya, Anda bisa melakukan tes khusus lainnya.
sumber
Jika Anda mencari metode untuk memfilter array dengan string yang terjadi pada kunci, Anda dapat menggunakan:
Hasilnya
print_r($mResult)
adalahAdaptasi jawaban ini yang mendukung ekspresi reguler
Keluaran
sumber
stristr
"fungsi" fungsi membuat beberapa asumsi untuk pengguna akhir. Mungkin akan lebih baik untuk mengizinkan pengguna untuk menyampaikan ekspresi reguler; ini akan memberi mereka lebih banyak fleksibilitas atas hal-hal tertentu seperti jangkar, batas kata, dan sensitivitas huruf, dll.Cara mendapatkan kunci array saat ini saat menggunakan
array_filter
Terlepas dari bagaimana saya suka solusi Vincent untuk masalah Maček, itu tidak benar-benar digunakan
array_filter
. Jika Anda datang ke sini dari mesin pencari Anda mungkin mencari tempat seperti ini ( PHP> = 5.3 ):Melewati array yang Anda filter sebagai referensi ke callback. Karena
array_filter
tidak secara konvensional beralih pada array dengan meningkatkan itu pointer internal publik Anda harus memajukannya sendiri.Yang penting di sini adalah Anda perlu memastikan array Anda disetel ulang, jika tidak Anda bisa mulai tepat di tengahnya.
Dalam PHP> = 5,4 Anda dapat membuat panggilan balik lebih pendek:
sumber
Berikut alternatif yang kurang fleksibel menggunakan unset () :
Hasil dari
print_r($array)
menjadi:Ini tidak berlaku jika Anda ingin menyimpan nilai yang difilter untuk digunakan nanti tetapi lebih rapi, jika Anda yakin tidak melakukannya.
sumber
unset()
. Tidak ada peringatan yang dikeluarkan jika kunci tidak ada.Mulai dari PHP 5.6, Anda dapat menggunakan
ARRAY_FILTER_USE_KEY
flag diarray_filter
:Jika tidak, Anda dapat menggunakan fungsi ini ( dari TestDummy ):
Dan di sini adalah versi augmented milik saya, yang menerima panggilan balik atau langsung kunci:
Terakhir namun tidak kalah pentingnya, Anda juga dapat menggunakan yang sederhana
foreach
:sumber
Mungkin berlebihan jika Anda membutuhkannya sekali saja, tetapi Anda dapat menggunakan pustaka YaLinqo * untuk memfilter koleksi (dan melakukan transformasi lainnya). Pustaka ini memungkinkan peforming query seperti SQL pada objek dengan sintaks yang lancar. Fungsinya
where
menerima calback dengan dua argumen: nilai dan kunci. Sebagai contoh:(
where
Fungsi mengembalikan iterator, jadi jika Anda hanya perlu mengulangi denganforeach
urutan yang dihasilkan sekali,->toArray()
dapat dihapus.)* Dikembangkan oleh saya
sumber
fungsi filter array dari php:
$ array - Ini adalah array input
$ callback_function - Fungsi callback yang digunakan , Jika fungsi callback kembali true , nilai saat ini dari array dikembalikan ke array hasil.
$ flag - Ini adalah parameter opsional , ini akan menentukan argumen apa yang dikirim ke fungsi callback. Jika parameter ini kosong maka fungsi callback akan mengambil nilai array sebagai argumen. Jika Anda ingin mengirim kunci array sebagai argumen, gunakan $ flag sebagai ARRAY_FILTER_USE_KEY . Jika Anda ingin mengirim kedua kunci dan nilai, Anda harus menggunakan $ flag sebagai ARRAY_FILTER_USE_BOTH .
Sebagai Contoh: Pertimbangkan array sederhana
Jika Anda ingin memfilter array berdasarkan kunci array , Kita perlu menggunakan ARRAY_FILTER_USE_KEY sebagai parameter ketiga dari array function array_filter.
Jika Anda ingin memfilter array berdasarkan kunci array dan nilai array , Kita perlu menggunakan ARRAY_FILTER_USE_BOTH sebagai parameter ketiga dari array function array_filter.
Contoh fungsi Panggilan Balik:
Ini akan menampilkan
sumber
Dengan fungsi ini Anda dapat memfilter array multidimensi
sumber
sumber
Solusi naif dan jelek (tetapi tampaknya lebih cepat)?
Hanya mencoba ini di php 7.3.11 tetapi loop jelek tampaknya mengeksekusi di sekitar sepertiga dari waktu. Hasil serupa pada array dengan beberapa ratus kunci. Optimalisasi mikro, mungkin tidak berguna di RW, tetapi ternyata mengejutkan dan menarik:
sumber
sumber