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 = array (1,1,2,3); return (count (array_intersect ($ haystack, $ needles)) == count ($ needles)); 이것은 거짓을 반환합니다. 그것은 좋지 않습니다. Rok Kralj의 솔루션이이 경우에 좋습니다.
ihtus

1
나는 그 배열 고유의 데이터를 보유해야한다고 생각하고, 그렇지 않으면이 솔루션하지 않습니다 일
Hashan 칸차나

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

8
주 : 배열 선언의이 유형> = 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 답변 (최고의 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
이것은 새로운 답변보다 Rok의 답변에 대한 의견으로 더 유용합니다.
희미한 신호

(당신이 ZERO 세부 사항을 제공) 어떻게 그렇게 @Jaymin은 ... 나를 위해 완벽하게 잘 작동 glot.io/snippets/f7dhw4kmju
sMyles

@sMyles 정수 대신 배열의 문자열 값을 사용해 보았습니다. 당신 편에서 한 번 시도하고 알려주십시오.
Jaymin

여전히 @Jaymin하면 해당 문제가없는 glot.io/snippets/f7dhw4kmju
sMyles

bool 변환은 array_intersect 가 비어 있거나 비어 있지 않을 수있는 배열을 반환하기 때문에 여기에 적합하지 않습니다 . @ rok-kralj 솔루션이 유일하게 선호되는 솔루션입니다.
codelearner 19-01-05

3

IMHO Mark Elliot의 솔루션이이 문제에 가장 적합합니다. 배열 요소간에 더 복잡한 비교 작업을 수행해야하고 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);

이것은 클로저에 의존합니다. 비교 기능은 훨씬 더 강력해질 수 있습니다. 행운을 빕니다!


나는 이미 모든 것을 어떻게했는지를 변경했기 때문에 최종 결과물에서 어느 쪽이든 할 필요가 없었습니다. 항상 배우는 것이 좋지만 귀하의 의견과 시간에 감사드립니다!
daryl 2011 년

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의 모든 값을 포함하는 배열을 리턴합니다.


empty () — 변수가 비어 있는지 확인

var가 있고 비어 있지 않고 0이 아닌 값이 있으면 FALSE를 반환합니다. 그렇지 않으면 TRUE를 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.