in_array () 및 다차원 배열


243

in_array()아래처럼 배열에 값이 있는지 확인하는 데 사용 합니다.

$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a)) 
{
    echo "Got Irix";
}

//print_r($a);

그러나 다차원 배열 (아래)은 어떻습니까? 다중 배열에 존재하는지 여부를 어떻게 확인할 수 있습니까?

$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r($b);

또는 in_array()다차원 배열에 관해서는 사용하지 않아야 합니까?


1
허용되는 솔루션은 훌륭하게 작동하지만 PHP의 유형 저글링으로 인해 엄격 하지 않은 비교를 수행 할 때 의도하지 않은 결과 가 발생할 수 있습니다 . 참조 : stackoverflow.com/a/48890256/1579327
Paolo

1
모두 jwueller 의 대답과 광산은 귀하의 질문에 대한 정답입니다. 나는 엄격하지 않은 비교를 할 때 PHP의 유형 저글링으로 인한 일반적인 구덩이를 피하기 위해 jwueller 의 기능 을 확장하는 대체 솔루션을 제안했습니다 .
Paolo

1
한 라이너 :var_dump(array_sum(array_map(function ($tmp) {return in_array('NT',$tmp);}, $multiarray)) > 0);
Agnius Vasiliauskas

1
@AgniusVasiliauskas 영리한 솔루션이지만 첫 번째 수준 배열에 배열이 아닌 항목이 포함 된 경우 문제가 발생합니다. 예 :$multiarray = array( "Hello", array("Mac", "NT"), array("Irix", "Linux"));
Paolo

1
@Paolo 아무도 당신의 필요에 따라 익명 함수를 확장하지 못하게합니다.이 경우 변수 $tmp가 함수 가있는 배열 이면 익명 함수에 체크인을 추가하십시오 is_array(). 배열이 아닌 경우 다른 시나리오로 진행하십시오.
Agnius Vasiliauskas

답변:


473

in_array()다차원 배열에서는 작동하지 않습니다. 이를 위해 재귀 함수를 작성할 수 있습니다.

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

용법:

$b = array(array("Mac", "NT"), array("Irix", "Linux"));
echo in_array_r("Irix", $b) ? 'found' : 'not found';

1
감사합니다. 기능은 우아합니다! 그것을 사랑하십시오! 감사. 함수를 실행할 때 화면에 아무것도 표시되지 않으므로 true 또는 false를 반환하는 것을 어떻게 알 수 있습니까? 감사.
laukok

14
나는 이것을하는 것을 찾고있었습니다. 당신은 저를 저만의 글로 쓰지 못하게
Liam W

1
잘 작동합니다. 배열 키를 어떻게 검색하고 표시 할 수 있습니까? 예를 들면 : $ b = array (1 => array ( "Mac", "NT"), 3 => array ( "Irix", "Linux"));
Rashad

2
StackOverflow의 @ D.Tate Code는 cc by-sa 3.0 에 따라 저작자 표시가 필요합니다 (페이지 바닥 글 참조). 이 답변에 대한 영구 링크와 함께 설명을 포함시킬 수 있습니다.
jwueller

1
@blamb : 매우 의도적입니다. 이것이 함수를 재귀 적으로 만드는 것입니다 (따라서, _r와 유사합니다 print_r()). 더 이상 배열을 찾을 수 없을 때까지 값을 검색하기 위해 모든 중첩 배열로 내려갑니다. 이 방법을 사용하면 2 단계 깊이가 아닌 임의의 복잡한 배열을 검색 할 수 있습니다.
jwueller

56

검색 할 열을 알고있는 경우 array_search () 및 array_column ()을 사용할 수 있습니다.

$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

if(array_search('urlof5465', array_column($userdb, 'url')) !== false) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

이 아이디어는 PHP 매뉴얼의 array_search () 주석 섹션에 있습니다.


15
in_array ( 'value', array_column ($ arr, 'active'))
ekstro

1
다음을위한 PHP 5.5 이상이 필요합니다.array_column
meconroy

1
이 예제에서 일치하는 하위 배열의 uid를 얻을 수 있습니까? @ethmz
zipal_

이것은 내가 원하는 것입니다
Juned Ansari

이것은 오랫동안이 솔루션을 찾은 후에 완벽합니다!
Rohan Ashik 2014

54

이것도 작동합니다.

function in_array_r($item , $array){
    return preg_match('/"'.preg_quote($item, '/').'"/i' , json_encode($array));
}

용법:

if(in_array_r($item , $array)){
    // found!
}

3
영리한 나는 이것을 좋아한다. foreach루프 와 비교하여 성능이 어떤지 궁금 합니다.
James

1
매력처럼 일했다.
kemicofa 유령

1
나를 잘못 생각하지 마라. 나는이 경우 에이 접근법을 좋아한다. 그러나 json_encoding과 일치 $array하는 연관 키가있는 경우 가양 성 일치를 리턴합니다 $item. 문자열 자체에 큰 따옴표가있을 때 문자열의 일부를 실수로 일치시킬 가능성은 말할 것도 없습니다. 이 질문과 같은 작고 단순한 상황에서만이 기능을 신뢰합니다.
mickmackusa

$itempreg_match
Paolo

35

이것은 그것을 할 것입니다 :

foreach($b as $value)
{
    if(in_array("Irix", $value, true))
    {
        echo "Got Irix";
    }
}

in_array1 차원 배열에서만 작동하므로 각 하위 배열을 반복하여 실행 in_array해야합니다.

다른 사람들이 지적했듯이 이것은 2 차원 배열에만 해당됩니다. 중첩 배열이 더 많으면 재귀 버전이 더 좋습니다. 이에 대한 예는 다른 답변을 참조하십시오.


7
그러나 이것은 한 차원에서만 작동합니다. 각 깊이를 확인하려면 재귀 함수를 만들어야합니다.
metrobalderas

코드를 실행했지만 오류가 있습니다. 구문 분석 오류 : 21 행의 C : \ wamp \ www \ 000_TEST \ php \ php.in_array \ index.php의 구문 분석 오류-if (in_array ( "Irix", $ value ) 감사합니다
laukok

@lauthiamkok : )언급 된 행의 끝에 누락 이 있습니다 .
jwueller

고마워, 나는 대답을 고쳤다. 너무 빨리 입력하고 코드를 다시 읽지 않으면 이런 일이 발생합니다.
Alan Geleynse

항상 in_array()세 번째 매개 변수를로 설정하여 호출해야 합니다 true. 이유를 확인하십시오 : stackoverflow.com/questions/37080581/…
Andreas

25

배열이 이와 같은 경우

$array = array(
              array("name" => "Robert", "Age" => "22", "Place" => "TN"), 
              array("name" => "Henry", "Age" => "21", "Place" => "TVL")
         );

이것을 사용하십시오

function in_multiarray($elem, $array,$field)
{
    $top = sizeof($array) - 1;
    $bottom = 0;
    while($bottom <= $top)
    {
        if($array[$bottom][$field] == $elem)
            return true;
        else 
            if(is_array($array[$bottom][$field]))
                if(in_multiarray($elem, ($array[$bottom][$field])))
                    return true;

        $bottom++;
    }        
    return false;
}

예 : echo in_multiarray("22", $array,"Age");


21
$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

$url_in_array = in_array('urlof5465', array_column($userdb, 'url'));

if($url_in_array) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

2
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Donald Duck

3
6 년 후, 그것은 내가 필요한 것을 주었다. array_column()
NappingRabbit

다차원 배열에 대한 완벽한 답변
Roshan Sankhe

14

훌륭한 기능이지만,에 추가하기 전까지는 작동하지 않았습니다 if($found) { break; }.elseif

function in_array_r($needle, $haystack) {
    $found = false;
    foreach ($haystack as $item) {
    if ($item === $needle) { 
            $found = true; 
            break; 
        } elseif (is_array($item)) {
            $found = in_array_r($needle, $item); 
            if($found) { 
                break; 
            } 
        }    
    }
    return $found;
}

11

다차원 어린이의 경우 : in_array('needle', array_column($arr, 'key'))

1 차원 어린이의 경우 : in_array('needle', call_user_func_array('array_merge', $arr))


1
산뜻한! 감사합니다 @ 9ksoft
가장 phaberest

그리고 달리 array_column()방법의 call_user_func_array('array_merge')방법은, 인덱스 기반 자식 배열 작동 한

6

다차원 배열을 항상 직렬화하고 다음을 수행 할 수 있습니다 strpos.

$arr = array(array("Mac", "NT"), array("Irix", "Linux"));

$in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";');

if($in_arr){
    echo "Got Irix!";
}

내가 사용한 것들에 대한 다양한 문서 :


1
그건 틀렸어요. 검색 문자열이 일부 배열 값에 포함되어 있으면 함수가 true를 제공합니다 ( "mytoll Irixus"에서 "Irix"를 찾습니다).
mdunisch 2016 년

내 대답을 수정했습니다. @ user3351722

이 방법은 더 이상 (고유 한 값) 값이없고 동적 일 때 문제를 해결할 수 있습니다. $ in_arr = (bool) strpos (serialize ($ user_term_was_downloaded), 's : 3 : "tid"; s : 2 : " '. $ value-> tid.'"; ');
Anees Hikmat Abu Hmiad

2
@ I--II Stack Overflow의 어느 누구도 코드 공유를 원하지 않는다면 코드를 게시 할 것이라고 생각하지 않습니다. 이 웹 사이트의 어떤 코드라도 자유롭게 사용하십시오. 나는 보통 코드 스 니펫 위에 "Thanks Stack Overflow"라는 주석을 추가 한 다음 코드를 찾은 URL을 붙여 넣습니다.

1
흥미로운 답변은 확실히 특정 상황에서 작동하지만 전부는 아닙니다.
MKN 웹 솔루션 3

4

이후 PHP 5.6더 깨끗 원래의 답변에 대한 해결책은 :

다음과 같은 다차원 배열을 사용하십시오.

$a = array(array("Mac", "NT"), array("Irix", "Linux"))

splat 연산자를 사용할 수 있습니다 :

return in_array("Irix", array_merge(...$a), true)

다음과 같은 문자열 키가있는 경우 :

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))

array_values오류를 피하기 위해 사용해야 합니다 Cannot unpack array with string keys.

return in_array("Irix", array_merge(...array_values($a)), true)

2

jwueller승인 된 솔루션 (작성 당시)

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

완벽하게 맞지만 약한 비교 (매개 변수 $strict = false)를 수행 할 때 의도하지 않은 동작이있을 수 있습니다 .

다른 유형의 값을 비교할 때 PHP의 유형 저글링으로 인해

"example" == 0

0 == "example"

를 평가합니다 true때문에이 "example"에 주조되어 int및로 바뀌 0.

( PHP가 0을 문자열과 같은 것으로 간주하는 이유는 무엇입니까? )

이것이 원하는 동작이 아닌 경우 엄격하지 않은 비교를 수행하기 전에 숫자 값을 문자열로 캐스트하는 것이 편리 할 수 ​​있습니다.

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {

        if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
            $item = (string)$item;
        }

        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

1

이것은 in_array 에 대한 PHP 매뉴얼 에서 찾은이 유형의 첫 번째 기능입니다 . 코멘트 섹션의 함수가 항상 최고는 아니지만 트릭을 수행하지 않으면 거기에서도 볼 수 있습니다 :)

<?php
function in_multiarray($elem, $array)
    {
        // if the $array is an array or is an object
         if( is_array( $array ) || is_object( $array ) )
         {
             // if $elem is in $array object
             if( is_object( $array ) )
             {
                 $temp_array = get_object_vars( $array );
                 if( in_array( $elem, $temp_array ) )
                     return TRUE;
             }

             // if $elem is in $array return true
             if( is_array( $array ) && in_array( $elem, $array ) )
                 return TRUE;


             // if $elem isn't in $array, then check foreach element
             foreach( $array as $array_element )
             {
                 // if $array_element is an array or is an object call the in_multiarray function to this element
                 // if in_multiarray returns TRUE, than return is in array, else check next element
                 if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) )
                 {
                     return TRUE;
                     exit;
                 }
             }
         }

         // if isn't in array return FALSE
         return FALSE;
    }
?>

배열을위한 것이기 때문에 elusive의 솔루션이 더 좋습니다
Gazillion

1

다음은 json_encode () 솔루션기반으로 한 제안 입니다.

  • 대소 문자를 구분하지 않는 옵션
  • 대신 카운트반환
  • 배열의 임의의 위치 (키 및 값)

단어를 찾지 못하면 여전히 0 과 같은 false를 반환합니다 .

function in_array_count($needle, $haystack, $caseSensitive = true) {
    if(!$caseSensitive) {
        return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle));
    }
    return substr_count(json_encode($haystack), $needle);
}

도움이 되길 바랍니다.


이 함수 는 하위 문자열과 일치합니다 : ex 00into 10000또는 lointo Hello. 또한 바늘에는json_encode 큰 따옴표와 같이 이스케이프되는 문자가 포함되어 있지 않습니다 .
Paolo

물론 그것은 당신이 무엇을 할 것인지에 달려 있지만,이 솔루션은 빠른 실행을 가지고 충분합니다.
Meloman

1

요즘 은 array_key_exists를 사용할 수 있다고 생각합니다 .

<?php
$a=array("Mac"=>"NT","Irix"=>"Linux");
if (array_key_exists("Mac",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
?>

1

배열 (haystack)에서 문자열과 배열 (바늘) 을 모두 검색 할 수있는 함수를 찾고 있었으므로 @jwueller답변에 추가했습니다 .

내 코드는 다음과 같습니다.

/**
 * Recursive in_array function
 * Searches recursively for needle in an array (haystack).
 * Works with both strings and arrays as needle.
 * Both needle's and haystack's keys are ignored, only values are compared.
 * Note: if needle is an array, all values in needle have to be found for it to
 * return true. If one value is not found, false is returned.
 * @param  mixed   $needle   The array or string to be found
 * @param  array   $haystack The array to be searched in
 * @param  boolean $strict   Use strict value & type validation (===) or just value
 * @return boolean           True if in array, false if not.
 */
function in_array_r($needle, $haystack, $strict = false) {
     // array wrapper
    if (is_array($needle)) {
        foreach ($needle as $value) {
            if (in_array_r($value, $haystack, $strict) == false) {
                // an array value was not found, stop search, return false
                return false;
            }
        }
        // if the code reaches this point, all values in array have been found
        return true;
    }

    // string handling
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle)
            || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}

0

처음부터 새로운 단 차원 배열을 생성하는 것도 효과적입니다.

$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

foreach ($arr as $row)  $vector[] = $row['key1'];

in_array($needle,$vector);

0

데이터베이스 결과 세트를 기반으로 작성된 다차원 배열의 경우 더 짧은 버전입니다.

function in_array_r($array, $field, $find){
    foreach($array as $item){
        if($item[$field] == $find) return true;
    }
    return false;
}

$is_found = in_array_r($os_list, 'os_version', 'XP');

os_version 필드에 $ os_list 배열에 'XP'가 포함되어 있으면 반환됩니다.


0

정말 작은 간단한 해결책을 찾았습니다.

배열이 :

Array
(
[details] => Array
    (
        [name] => Dhruv
        [salary] => 5000
    )

[score] => Array
    (
        [ssc] => 70
        [diploma] => 90
        [degree] => 70
    )

)

코드는 다음과 같습니다.

 if(in_array("5000",$array['details'])){
             echo "yes found.";
         }
     else {
             echo "no not found";
          }

0

이 방법을 사용하면 여러 개의 중첩에서 작동하며 해킹이 필요하지 않습니다.

<?php
    $blogCategories = [
        'programing' => [
            'golang',
            'php',
            'ruby',
            'functional' => [
                'Erlang',
                'Haskell'
            ]
        ],
        'bd' => [
            'mysql',
            'sqlite'
        ]
    ];
    $it = new RecursiveArrayIterator($blogCategories);
    foreach (new RecursiveIteratorIterator($it) as $t) {
        $found = $t == 'Haskell';
        if ($found) {
           break;
        }
    }

-1

시도하십시오 :

in_array("irix",array_keys($b))
in_array("Linux",array_keys($b["irix"])

필요에 대해 잘 모르겠지만 요구 사항에 맞을 수 있습니다.


2
배열 키를 검색하면 어떤 작업이 수행됩니까? $b의 배열 키는 정수일뿐입니다.이 배열에는 지정된 키가 없습니다 ... 존재하지 않기 array_keys($b["irix"])때문에 오류가 발생 $b["irix"]합니다.
Ben D


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