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 = масив (1,2); $ копиця сіна = масив (1,1,2,3); return (count (array_intersect ($ копиця сіна, $ голки)) == count ($ голки)); це поверне помилкове, що не добре. Рішення Рока Краля добре для цієї справи.
ihtus

1
Я думаю, що цей масив повинен містити унікальні дані, інакше це рішення не працюватиме
Хашан

182

Як розробник, ви, ймовірно, повинні почати вивчати задані операції (різниця, з'єднання, перетин). Ви можете уявити свій масив як один "набір", а ключі, за якими ви шукаєте інший.

Перевірте, чи ВСІ голки існують

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
Claudiu Hojda

Відмінне рішення за умови, що вам не потрібно проводити суворе порівняння.
фансигнал

14
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 (найкраще ІМО), щоб перевірити, чи існує якась голка в стозі сіна, ви можете використовувати її, (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
Це було б корисніше як коментар до відповіді Рока, ніж як нова відповідь.
невдалий

@Jaymin як так (ви надали деталі про ZERO) ... для мене прекрасно працює glot.io/snippets/f7dhw4kmju
sMyles

@sMyles Я намагався використовувати значення рядка в масиві замість цілого. Ви можете спробувати один раз з вашої сторони і дайте мені знати.
Джеймін

@Jaymin досі не має цього питання glot.io/snippets/f7dhw4kmju
sMyles

Це перетворення bool тут не підходить, оскільки array_intersect повертає масив, який може бути порожнім або не порожнім. @ rok-kralj рішення є єдиним кращим.
codelearner

3

ІМХО найкраще вирішує цю проблему Марк Еліот. Якщо вам потрібно зробити більш складні операції порівняння між елементами масиву І ви перебуваєте на 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 () повертає масив, що містить усі значення масиву1, які є у всіх аргументах. Зауважте, що ключі збережені.

Повертає масив, що містить усі значення масиву1, значення яких існують у всіх параметрах.


empty () - Визначте, чи є змінною порожньою

Повертає FALSE, якщо var існує і має не порожнє, ненульове значення. В іншому випадку повертається ІСТИНА.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.