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

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

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

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

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

 $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 } 

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

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

 function in_array_all($needles, $haystack) { return !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 !!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 
 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 } 

Решение IMHO Mark Elliot's лучше всего подходит для этой проблемы. Если вам нужно выполнить более сложные операции сравнения между элементами массива И вы на 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); 

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

Исходя из ответа @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