dizi içi çoklu değerler


110

Birden çok değeri nasıl kontrol ederim, örneğin:

$arg = array('foo','bar');

if(in_array('foo','bar',$arg))

Bu bir örnek, bu yüzden biraz daha iyi anlarsın, işe yaramayacağını biliyorum.

Yanıtlar:


200

Hedefleri samanlık ile kesiştirin ve kesişme noktasının hedeflere tam olarak eşit olduğundan emin olun:

$haystack = array(...);

$target = array('foo', 'bar');

if(count(array_intersect($haystack, $target)) == count($target)){
    // all of $target is in $haystack
}

Bunun $haystackbir üst kümesi olduğunu söylemek için , yalnızca ortaya çıkan kesişimin boyutunun hedef değerler dizisi ile aynı boyutta olduğunu doğrulamanız gerektiğini unutmayın $target.

En az bir değerin $targetde içinde olduğunu doğrulamak için şu $haystackkontrolü yapabilirsiniz:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }

13
bu çözüm en iyisi değil: $ needles = array (1,2); $ samanlık = dizi (1,1,2,3); return (count (array_intersect ($ samanlık, $ iğneler)) == count ($ iğneler)); bu yanlış döndürür, bu iyi değil. Rok Kralj'ın çözümü bu dava için iyidir.
ihtus

1
Bu dizinin benzersiz verileri tutması gerektiğini düşünüyorum, aksi takdirde bu çözüm işe yaramayacak
Hashan Kanchana

183

Bir geliştirici olarak, muhtemelen set işlemlerini (fark, birleşim, kesişim) öğrenmeye başlamalısınız. Dizinizi bir "küme" olarak ve aradığınız anahtarları diğerinde hayal edebilirsiniz.

TÜM iğnelerin var olup olmadığını kontrol edin

function in_array_all($needles, $haystack) {
   return empty(array_diff($needles, $haystack));
}

echo in_array_all( [3,2,5], [5,8,3,1,2] ); // true, all 3, 2, 5 present
echo in_array_all( [3,2,5,9], [5,8,3,1,2] ); // false, since 9 is not present

İğnelerden HERHANGİ BİRİNİN var olup olmadığını kontrol edin

function in_array_any($needles, $haystack) {
   return !empty(array_intersect($needles, $haystack));
}

echo in_array_any( [3,9], [5,8,3,1,2] ); // true, since 3 is present
echo in_array_any( [4,9], [5,8,3,1,2] ); // false, neither 4 nor 9 is present

9
Not: bu tür dizi bildirimi> = PHP 5.4
Claudiu Hojda

Kesin bir karşılaştırma yapmanıza gerek kalmaması koşuluyla mükemmel çözüm.
bayılma

15
if(in_array('foo',$arg) && in_array('bar',$arg)){
    //both of them are in $arg
}

if(in_array('foo',$arg) || in_array('bar',$arg)){
    //at least one of them are in $arg
}

7

Samanlıkta iğnelerden herhangi birinin olup olmadığını kontrol etmek için @Rok Kralj cevabından (en iyi IMO) çıkmak, (bool)bunun yerine !!bazen kod incelemesi sırasında kafa karıştırıcı olabilen kullanabilirsiniz.

function in_array_any($needles, $haystack) {
   return (bool)array_intersect($needles, $haystack);
}

echo in_array_any( array(3,9), array(5,8,3,1,2) ); // true, since 3 is present
echo in_array_any( array(4,9), array(5,8,3,1,2) ); // false, neither 4 nor 9 is present

https://glot.io/snippets/f7dhw4kmju


9
Bu, yeni bir cevaptan çok Rok'un cevabına bir yorum olarak daha faydalı olacaktır.
baygınlık

@Jaymin nasıl yani (SIFIR ayrıntılar sağladınız) ... benim için mükemmel çalışıyor glot.io/snippets/f7dhw4kmju
sMyles

@sMyles Dizide tamsayı yerine dize değerini kullanmayı denedim. Kendi tarafında bir kez deneyebilir ve bana haber verebilirsin.
Jaymin


Bu bool dönüşümü burada uygun değildir çünkü array_intersect boş veya boş olmayan bir dizi döndürür. @ rok-kralj çözümü tercih edilen tek çözümdür.
codelearner

3

IMHO Mark Elliot'ın çözümü bu sorun için en iyisidir. Dizi öğeleri arasında daha karmaşık karşılaştırma işlemleri yapmanız gerekiyorsa VE PHP 5.3'teyseniz, aşağıdaki gibi bir şey de düşünebilirsiniz:

<?php

// First Array To Compare
$a1 = array('foo','bar','c');

// Target Array
$b1 = array('foo','bar');


// Evaluation Function - we pass guard and target array
$b=true;
$test = function($x) use (&$b, $b1) {
        if (!in_array($x,$b1)) {
                $b=false;
        }
};


// Actual Test on array (can be repeated with others, but guard 
// needs to be initialized again, due to by reference assignment above)
array_walk($a1, $test);
var_dump($b);

Bu bir kapanışa dayanır; karşılaştırma işlevi çok daha güçlü hale gelebilir. İyi şanslar!


Zaten her şeyi nasıl yaptığımı değiştirdim, bu yüzden son çıktıda bunu da yapmam gerekmiyordu, ancak öğrenmesi her zaman iyi olsa da, girdiniz ve zamanınız için teşekkürler!
daryl

2
if(empty(array_intersect([21,22,23,24], $check_with_this)) {
 print "Not found even a single element";
} else {
 print "Found an element";
}

array_intersect () , tüm argümanlarda bulunan dizi1'in tüm değerlerini içeren bir dizi döndürür. Anahtarların korunduğunu unutmayın.

Dizi1'deki değerleri tüm parametrelerde bulunan tüm değerleri içeren bir dizi döndürür.


empty () - Bir değişkenin boş olup olmadığını belirleyin

Var varsa ve boş olmayan, sıfır olmayan bir değere sahipse FALSE döndürür. Aksi takdirde DOĞRU döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.