php检查数组的数组中是否存在值

php检查数组的数组中是否存在值,php,arrays,Php,Arrays,我在一个数组中有一个数组 $a = array ( 0 => array ( 'value' => 'America', ), 1 => array ( 'value' => 'England', ), ) 如何检查数组中是否存在“America”?America阵列可以是任意键,并且可以有任意数量的子阵列,所以请给出一个通用的解决方案 查看php手册,我在_数组中看到了,但这只适用于顶层。所以类似于_数组中的(“America”,$a)的东西是不起作用的 谢谢。一般的

我在一个数组中有一个数组

$a = array ( 0 => array ( 'value' => 'America', ), 1 => array ( 'value' => 'England', ), )
如何检查数组中是否存在“America”?America阵列可以是任意键,并且可以有任意数量的子阵列,所以请给出一个通用的解决方案

查看php手册,我在_数组中看到了,但这只适用于顶层。所以类似于_数组中的
(“America”,$a)
的东西是不起作用的


谢谢。

一般的解决方案是:

function deep_in_array($needle, $haystack) {
    if(in_array($needle, $haystack)) {
        return true;
    }
    foreach($haystack as $element) {
        if(is_array($element) && deep_in_array($needle, $element))
            return true;
    }
    return false;
}
我选择在_array循环中使用
的原因是:在检查数组结构的更深层次之前,我确保搜索的值不在当前层次。这样,我希望代码比使用某种深度优先搜索方法更快


当然,如果您的数组始终是二维的,并且您只想在这种数组中搜索,那么这会更快:

function in_2d_array($needle, $haystack) {
    foreach($haystack as $element) {
        if(in_array($needle, $element))
            return true;
    }
    return false;
}

PHP没有本机的
array\u search\u recursive()
函数,但您可以定义一个:

function array_search_recursive($needle, $haystack) {
    foreach ($haystack as $value) {
        if (is_array($value) && array_search_recursive($needle, $value)) return true;
        else if ($value == $needle) return true;
    }
    return false;
}

未经测试,但您明白了。

如果所有数组只包含一个值,为什么要将它们放入数组中?为什么不将值分配给该键呢?脚本是否只在大型多维数组中查找一个或少量元素?或者它会搜索大量的元素,这可能会使在搜索之前创建一个包含所有元素的平面哈希表/数组“更便宜”?对不起,数组中实际上有更多的值,我试图简化它以解决这个问题,我想这会适得其反。嘿,Felix;)可能比我的快,因为你只遍历数组一次。另一方面,您将始终首先检查数组,尽管搜索值可能已经存在于当前数组级别。我认为
返回
后的
if(is_array…
有问题。不能对每个元素进行返回。相反,您应该只在调用数组中的
deep\u
返回true时返回。我的数组始终是二维的。我喜欢这两个答案都叫费利克斯你的第二个选择比其他费利克斯的快吗?@middus:你说得对,我没意识到。非常感谢你!呵呵,其实我也是一只“猫”。另一个费利克斯的答案是一般解,而不是二维解。@Mark:这取决于数组的结构。可能是的。
function search($a,$searchval){  //$a - array; $searchval - search value;
if(is_array($a)) {
foreach($a as $val){ 
if(is_array($val))
if(in_array($searchval,$val)) return true;  
}
}
else return false;
}

search($a, 'America'); //function call