in_array()和多维数组

lau*_*kok 234 php arrays multidimensional-array

in_array()用来检查数组中是否存在值,如下所示

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

//print_r($a);
Run Code Online (Sandbox Code Playgroud)

但是多维数组怎么样(下图) - 如何检查该值是否存在于多数组中?

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

print_r($b);
Run Code Online (Sandbox Code Playgroud)

或者我不应该在使用in_array()多维数组时使用?

jwu*_*ler 459

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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

  • 我正在寻找能做到这一点的事情,你只是让我自己写下来:) (13认同)
  • StackOverflow上的@ D.Tate代码是根据[cc by-sa 3.0](https://creativecommons.org/licenses/by-sa/3.0/)许可的,需要归属(参见页脚).您只需在此答案中包含一条评论即可. (2认同)

小智 53

这也会奏效.

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

用法:

if(in_array_r($item , $array)){
    // found!
}
Run Code Online (Sandbox Code Playgroud)

  • 聪明,我喜欢这个.我想知道与`foreach`循环相比,性能是什么样的. (3认同)

eth*_*hmz 50

如果您知道要搜索哪个列,则可以使用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';
}
Run Code Online (Sandbox Code Playgroud)

这个想法在PHP手册的array_search()的注释部分;

  • 你也可以尝试:in_array('value',array_column($ arr,'active')) (12认同)

Ala*_*nse 33

这样做:

foreach($b as $value)
{
    if(in_array("Irix", $value, true))
    {
        echo "Got Irix";
    }
}
Run Code Online (Sandbox Code Playgroud)

in_array仅在一维数组上运行,因此您需要遍历每个子数组并在每个子数组上运行in_array.

正如其他人所指出的那样,这只适用于二维阵列.如果你有更多的嵌套数组,递归版本会更好.请参阅其他答案的示例.

  • 但是,这只能在一个方面起作用.您必须创建递归函数以检查每个深度. (7认同)

ryn*_*nhe 24

如果你的阵列是这样的

$array = array(
              array("name" => "Robert", "Age" => "22", "Place" => "TN"), 
              array("name" => "Henry", "Age" => "21", "Place" => "TVL")
         );
Run Code Online (Sandbox Code Playgroud)

用这个

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;
}
Run Code Online (Sandbox Code Playgroud)

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


小智 16

$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';
}
Run Code Online (Sandbox Code Playgroud)

  • 6 年后,它给了我我需要的东西。`array_column()` (3认同)
  • 虽然此代码可以回答这个问题,但提供有关如何和/或解决问题的原因的其他背景将提高答案的长期价值. (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)


Moh*_*jib 9

对于多维儿童: in_array('needle', array_column($arr, 'key'))

对于一维儿童: in_array('needle', call_user_func_array('array_merge', $arr))


小智 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!";
}
Run Code Online (Sandbox Code Playgroud)

我使用的各种文档:

  • @ I - II认为Stack Overflow上的任何人都不会发布代码,如果他们不希望它被共享的话.随意使用本网站上的任何代码.我通常在代码片段上方添加一条注释,其中显示"Thanks Stack Overflow",然后粘贴我找到代码的URL. (2认同)

Fab*_*les 6

PHP 5.6 开始,原始答案有一个更好、更清晰的解决方案:

使用这样的多维数组:

$a = array(array("Mac", "NT"), array("Irix", "Linux"))
Run Code Online (Sandbox Code Playgroud)

我们可以使用splat 运算符

return in_array("Irix", array_merge(...$a), true)
Run Code Online (Sandbox Code Playgroud)

如果您有这样的字符串键:

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))
Run Code Online (Sandbox Code Playgroud)

您将不得不使用array_values以避免错误Cannot unpack array with string keys

return in_array("Irix", array_merge(...array_values($a)), true)
Run Code Online (Sandbox Code Playgroud)