in_array несколько значений

110

Как проверить наличие нескольких значений, например:

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

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

Это пример, чтобы вы понимали немного лучше, я знаю, что это не сработает.

Дэрил
источник

Ответы:

200

Пересеките цели стогом сена и убедитесь, что пересечение точно совпадает с целями:

$haystack = array(...);

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

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

Обратите внимание, что вам нужно только убедиться, что размер результирующего пересечения совпадает с размером массива целевых значений, чтобы сказать, что $haystackэто надмножество $target.

Чтобы убедиться, что хотя бы одно значение $targetтакже присутствует $haystack, вы можете выполнить эту проверку:

 if(count(array_intersect($haystack, $target)) > 0){
     // at least one of $target is in $haystack
 }
Марк Эллиот
источник
13
это решение не самое лучшее: $ Needles = array (1,2); $ haystack = массив (1,1,2,3); return (count (array_intersect ($ haystack, $ Needles)) == count ($ Needles)); это вернет false, это не хорошо. В этом случае хорошо подходит решение Рока Краля.
ihtus
1
Я думаю, что этот массив должен содержать уникальные данные, иначе это решение не сработает,
Хашан
183

Как разработчику вам, вероятно, следует начать изучение операций над множеством (разность, объединение, пересечение). Вы можете представить свой массив как один «набор», а ключи, которые вы ищете, - другой.

Проверьте, ВСЕ ли иглы существуют

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

Проверьте, существует ли ЛЮБАЯ из игл

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
Примечание: этот тип объявления массива -> = PHP 5.4
Клаудиу Хойда
Отличное решение при условии, что не нужно проводить строгое сравнение.
faintsignal 03
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
}
RiaD
источник
7

Отказ от ответа @Rok Kralj (лучший IMO), чтобы проверить, существует ли какая-либо из иголок в стоге сена, которую вы можете использовать (bool)вместо этого, !!что иногда может сбивать с толку во время проверки кода.

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

sMyles
источник
9
Это было бы более полезно в качестве комментария к ответу Рока, чем в качестве нового ответа.
faintsignal
@Jaymin, как так (вы предоставили НУЛЕВЫЕ подробностей) ... у меня отлично работает glot.io/snippets/f7dhw4kmju
sMyles 07
@sMyles Я пробовал использовать строковое значение в массиве вместо целого числа. Вы можете попробовать один раз со своей стороны и сообщить мне.
Jaymin
@Jaymin все еще не имеет этой проблемы glot.io/snippets/f7dhw4kmju
sMyles
Это преобразование типа bool здесь не подходит, поскольку array_intersect возвращает массив, который может быть пустым или непустым. Решение @ rok-kralj является единственным предпочтительным.
codelearner
3

IMHO Лучшее решение Марка Эллиота для этой проблемы. Если вам нужно выполнить более сложные операции сравнения между элементами массива, И вы используете PHP 5.3, вы также можете подумать о чем-то вроде следующего:

<?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);

Это зависит от закрытия; функция сравнения может стать намного более мощной. Удачи!

мараспин
источник
Я изменил то, как я уже все делал, поэтому в конечном результате мне не нужно было делать это в любом случае, хотя всегда полезно учиться, спасибо за ваш вклад и ваше время!
Дэрил
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 () возвращает массив, содержащий все значения array1, которые присутствуют во всех аргументах. Обратите внимание, что ключи сохранены.

Возвращает массив, содержащий все значения в array1, значения которых существуют во всех параметрах.


пустой () - определяет, пуста ли переменная

Возвращает FALSE, если var существует и имеет непустое ненулевое значение. В противном случае возвращает ИСТИНА.

Умеш Патил
источник