array_filter($array, $callback) $callback fonksiyonunun true (veya true değerine dönüşen herhangi bir değer) döndürdüğü $array elemanlarını döndürür. Önce dizi, sonra geri çağırma gelir ve kalan elemanlar orijinal anahtarlarını korur.
Sonuçtaki anahtarlar 1, 3, 5, 7'dir: bu değerlerin orijinal dizideki konumları. Bu ayrıntı göründüğünden daha önemlidir ve iki bölüm sonrası onunla nasıl başa çıkılacağını gösterir.
Bir diziden boş değerleri kaldırma
array_filter fonksiyonunu geri çağırma olmadan çağırırsanız false değerine dönüşen her değeri kaldırır: boş dizgeler, null, false, 0, "0" ve boş diziler. Bu, bir explode() çıktısının parçalarını veya bir form alanları listesini temizlemenin en hızlı yoludur.
İlk sonuç çoğu zaman gerçek veri olan (sıfır miktar, bir posta kodu rakamı) "0" ve 0 değerlerini de kaybetti. Sıfır geçerli bir yanıt olduğunda ikinci çağrıdaki gibi geri çağırmayı kendiniz yazın. PHP'nin boş saydığı değerlerin tam listesi empty sayfasında.
Sonucu array_values ile yeniden indeksleme
Anahtarlar korunduğu için süzülmüş bir listede boşluklar olabilir. 0'dan başlayan bir for döngüsü o zaman eksik anahtarlara çarpar ve json_encode sonucu dizi yerine bir JSON nesnesine çevirir. array_values() onu yeniden numaralar.
ARRAY_FILTER_USE_KEY ile anahtara göre süzme
Üçüncü argüman geri çağırmanın ne alacağını seçer. ARRAY_FILTER_USE_KEY yalnızca anahtarı verir. ARRAY_FILTER_USE_BOTH önce değeri, sonra anahtarı verir.
Zaten bildiğiniz sabit bir anahtar kümesini tutmak için array_intersect_key($config, array_flip(['db_host', 'db_port'])) aynı işi geri çağırma olmadan yapar.
Çok boyutlu bir diziyi süzme
Gerçek verilerin çoğu bir satır listesidir. Geri çağırma her seferinde bir satır alır, bu yüzden hangi alana ihtiyacınız varsa onu test edersiniz.
$maxPrice değerini değiştirin ve tekrar çalıştırın. Ardından yalnızca isimleri almak için sonucu array_column fonksiyonuna verin: array_column($affordable, 'name').
Süz, sonra eşle, sonra indirge
array_filter elemanları seçer, array_map onları değiştirir ve array_reduce diziyi tek bir değere indirger. array_reduce($array, $callback, $initial) geri çağırmayı biriken toplam ve bir sonraki elemanla çağırır.
Düz bir toplam için array_sum($totals) daha kısadır. array_reduce sonuç başka bir şey olduğunda yerini hak eder: bir dizge, grup başına bir sayı, en büyük satır.
Sık yapılan hata: array_filter içinde değerleri değiştirmek
Geri çağırmanın dönüş değeri yalnızca bir elemanın kalıp kalmayacağına karar verir. Hesapladığı diğer her şey atılır, bu yüzden bu kod hiçbir şeyi kırpmaz:
array_map ile dönüştürün, sonra süzün ve temiz bir listeye ihtiyacınız olduğunda array_values ekleyin.
Sıkça Sorulan Sorular
PHP'de bir diziden boş değerleri nasıl kaldırırım?
array_filter($array) fonksiyonunu geri çağırma olmadan çağırın: falsy olan her değeri atar ("", null, false, 0, "0", []). Yalnızca boş dizgeleri ve null değerini atıp 0 değerini tutmak için bir geri çağırma verin: array_filter($array, fn($v) => $v !== '' && $v !== null).
array_filter eski anahtarları neden koruyor?
array_filter asla yeniden numaralamaz: tuttuğu elemanlar orijinal anahtarları altında kalır, bu yüzden bir liste [0 => 'a', 2 => 'c'] olarak geri gelebilir. Yeniden 0, 1, 2 elde etmek için array_values() ile sarın; bu ayrıca json_encode fonksiyonunun nesne yerine bir JSON dizisi üretmesini sağlar.
PHP'de bir diziyi anahtara göre nasıl süzerim?
Üçüncü argüman olarak ARRAY_FILTER_USE_KEY verin, geri çağırma değer yerine anahtarı alır: array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY). Değeri ve anahtarı almak için ARRAY_FILTER_USE_BOTH kullanın.
array_filter ile array_map arasındaki fark nedir?
array_filter hangi elemanların kalacağına karar verir ve onları değiştirmeden döndürür. array_map her elemanı değiştirir ve aynı sayıda eleman döndürür. İkisini birden yapmak için zincirleyin: array_map('strtoupper', array_filter($arr)).