Şaşırtıcı bir şekilde array_keys_exist
yok mu ?! Bu arada, bu ortak görev için tek bir satırlık ifade bulmak için biraz boşluk bırakılır. Bir kabuk komut dosyası veya başka bir küçük program düşünüyorum.
Not: Aşağıdaki çözümlerin her biri özlü kullanır […]
php 5.4+ 'de bulunan dizi bildirimi sözdizimini kullanır.
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
} else {
}
( Kim Stacks'e şapka ipucu )
Bu yaklaşım, bulduğum en kısa olanı. array_diff()
öğeleri bir dizi döner değişken 1 içinde mevcut olup argument2 mevcut. Bu nedenle boş bir dizi tüm anahtarların bulunduğunu gösterir. Php 5.5'te 0 === count(…)
basit olmayı basitleştirebilirsiniz empty(…)
.
if (0 === count(array_reduce(array_keys($source),
function($in, $key){ unset($in[array_search($key, $in)]); return $in; },
['story', 'message', '…'])))
{
} else {
}
Okuması daha zor, değiştirmesi kolay. array_reduce()
bir değere ulaşmak için bir dizi üzerinde yinelemek için bir geri arama kullanır. Anahtarları besleyerek, $initial
değeriyle ilgileniyoruz$in
ve ardından kaynakta bulunan anahtarları kaldırarak, tüm anahtarlar bulunursa 0 öğeyle bitmeyi bekleyebiliriz.
İlgilendiğimiz anahtarlar, alt satıra hoş bir şekilde uyduğundan, yapının değiştirilmesi kolaydır.
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
} else {
}
Çözüme göre yazmak daha array_reduce
basittir, ancak düzenlemek biraz daha zordur. array_filter
ayrıca geri aramada true (öğeyi yeni diziye kopyala) veya false (kopyalama) döndürerek filtrelenmiş bir dizi oluşturmanıza olanak sağlayan yinelemeli bir geri çağrıdır. Gotchya, 2
beklediğiniz öğelerin sayısını değiştirmeniz gerektiğidir .
Bu daha dayanıklı hale getirilebilir ama akıl almaz okunabilirlik sınırında:
$find = ['story', 'message'];
if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); })))
{
} else {
}