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.