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
}

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


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 существует и имеет непустое ненулевое значение. В противном случае возвращает ИСТИНА.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.