복붙노트

in_array () 및 다차원 배열

PHP

in_array () 및 다차원 배열

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. ==============================

    1.

    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';
    
  2. ==============================

    2.

    이것도 작동합니다.

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

    용법:

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

    3.

    검색 할 열을 알고 있으면 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 ()에 대한 주석 섹션에 있습니다.

  4. ==============================

    4.

    이렇게 할 것이다 :

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

    in_array는 1 차원 배열에서만 작동하므로 각 하위 배열을 반복하고 각각에 대해 in_array를 실행해야합니다.

    다른 사람들이 지적했듯이, 이것은 2 차원 배열을위한 것입니다. 중첩 된 배열이 더 많은 경우 재귀 버전이 더 좋을 것입니다. 그 예에 대한 다른 답변을보십시오.

  5. ==============================

    5.

    이 배열이

    $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");

  6. ==============================

    6.

    위대한 기능,하지만 그것은 나를 위해 일할 때까지 작동하지 않았다 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;
    }
    
  7. ==============================

    7.

    $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';
    }
    
  8. ==============================

    8.

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

    $arr = array(array("Mac", "NT"), array("Irix", "Linux"));
    
    $in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";');
    
    if($in_arr){
        echo "Got Irix!";
    }
    

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

  9. ==============================

    9.

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

    일차원 어린이를위한 : in_array ( 'needle', call_user_func_array ( 'array_merge', $ arr))

  10. ==============================

    10.

    다음은 json_encode () 솔루션을 기반으로하는 나의 제안이다.

    단어를 찾을 수 없으면 여전히 0을 반환합니다.

    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);
    }
    

    희망이 도움이됩니다.

  11. ==============================

    11.

    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"
    

    "example"이 int로 변환되어 0으로 바뀌므로 true를 평가합니다.

    (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;
    }
    
  12. ==============================

    12.

    이것은 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;
        }
    ?>
    
  13. ==============================

    13.

    원래의 배열과는 다른 새로운 차원의 배열을 만들기도합니다.

    $arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");
    
    foreach ($arr as $row)  $vector[] = $row['key1'];
    
    in_array($needle,$vector);
    
  14. ==============================

    14.

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

    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_list 배열에 os_version 필드에 'XP'가 포함되어 있으면 반환됩니다.

  15. ==============================

    15.

    요즘에는 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!";
      }
    ?>
    
  16. ==============================

    16.

    배열 (건초 더미)에서 문자열과 배열을 모두 검색 할 수있는 함수를 찾고 있었기 때문에 @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;
    }
    
  17. ==============================

    17.

    시도하십시오 :

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

    임에 대한 확신이 없지만 요구 사항에 맞을 수도 있습니다.

  18. ==============================

    18.

    array_search는 어떨까요? https://gist.github.com/Ocramius/1290076에 따르면 foreach보다 훨씬 빠릅니다.

    if( array_search("Irix", $a) === true) 
    {
        echo "Got Irix";
    }
    
  19. ==============================

    19.

    너는 이렇게 사용할 수있다.

    $result = array_intersect($array1, $array2);
    print_r($result);
    

    http://php.net/manual/tr/function.array-intersect.php

  20. from https://stackoverflow.com/questions/4128323/in-array-and-multidimensional-array by cc-by-sa and MIT lisence