PHP:检查多维数组中是否存在值和键

时间:2011-08-09 02:41:02

标签: php arrays

只是想知道你是否可以帮我解决这个问题:

我有一个多维数组...

$my_array = array(    
        0 =>  array(  
            "name"   => "john",  
            "id"    =>  4  
        ),  
        1   =>  array(  
            "name" =>  "mark",  
            "id" => 152  
        ), 
    2   =>  array(  
            "name" =>  "Eduard",  
            "id" => 152  
        )
);

任何关于检查数组$ my_array是否包含任何带有“id”键及其值152的值的最快和最有效方法的想法。我不需要回显或使用任何值。如果数组中有任何ID为“key”且值为“152”的记录,我只需要检查(返回true)。

15 个答案:

答案 0 :(得分:64)

没有什么比简单的循环更快。您可以混合并匹配一些数组函数来执行此操作,但它们也只是作为循环实现。

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}

答案 1 :(得分:21)

这是Dan Grossman的答案的更新版本,它将满足多维数组(我之后的目标):

function find_key_value($array, $key, $val)
{
    foreach ($array as $item)
    {
        if (is_array($item) && find_key_value($item, $key, $val)) return true;

        if (isset($item[$key]) && $item[$key] == $val) return true;
    }

    return false;
}

答案 2 :(得分:11)

** PHP> = 5.5

简单地说你可以使用这个

$key = array_search(40489, array_column($userdb, 'uid'));

让我们假设这个多维数组:

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

(1) => Array
    (
        (uid) => '5465',
        (name) => 'Stefanie Mcmohn',
        (pic_square) => 'urlof100'
    ),

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

$key = array_search(40489, array_column($userdb, 'uid'));

答案 3 :(得分:8)

如果你必须进行大量的“id”查找并且它应该非常快,你应该使用包含所有“id”作为键的第二个数组:

$lookup_array=array();

foreach($my_array as $arr){
    $lookup_array[$arr['id']]=1;
}

现在,您可以非常快速地检查现有ID,例如:

echo (isset($lookup_array[152]))?'yes':'no';

答案 4 :(得分:4)

正如你的问题,这实际上是一个简单的二维数组不是更好吗?看看 -

假设您的二维数组名称$ my_array和要查找的值是$ id

function idExists($needle='', $haystack=array()){
    //now go through each internal array
    foreach ($haystack as $item) {
        if ($item['id']===$needle) {
            return true;
        }
    }
    return false;
}

并称之为:

idExists($id, $my_array);

正如您所看到的,它实际上只检查是否只有key_name'id'的内部索引,具有您的$ value。如果key_name'name'也有$ value

,那么这里的一些其他答案也可能是真的

答案 5 :(得分:2)

return 0 < count(
    array_filter(
        $my_array,
        function ($a) {
            return array_key_exists('id', $a) && $a['id'] == 152;
        }
    )
);

注意:array_key_exists来电是可选的。它只是为了代码的耐用性。

答案 6 :(得分:1)

尝试使用以下代码。它应该适用于任何类型的多维数组搜索。

您可以在此处查看LIVE DEMO EXAMPLE

function multi_array_search($search_for, $search_in) {
    foreach ($search_in as $element) {
        if ( ($element === $search_for) ){
            return true;
        }elseif(is_array($element)){
            $result = multi_array_search($search_for, $element);
            if($result == true)
                return true;
        }
    }
    return false;
}

答案 7 :(得分:1)

一个好的解决方案可以是@Elias Van Ootegan在评论中提供的解决方案:

$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";

我试过并为我工作,感谢伙计。

<强>被修改

注意:它适用于PHP 5.5 +

答案 8 :(得分:1)

我偶然发现了这篇文章,希望做同样的事情,并提出了自己的解决方案,我想为该页面的未来访问者提供该解决方案(并查看这样做是否会带来我没有预见到的任何问题)。

如果要获取简单的truefalse输出,并希望使用一行代码执行此操作而没有函数或循环,则可以序列化数组,然后使用{{1} }搜索值:

stripos

这似乎对我有用。

答案 9 :(得分:0)

我编写了以下函数,以确定多维数组是否部分包含某个值。

function findKeyValue ($array, $needle, $value, $found = false){
    foreach ($array as $key => $item){
        // Navigate through the array completely.
        if (is_array($item)){
            $found = $this->findKeyValue($item, $needle, $value, $found);
        }

        // If the item is a node, verify if the value of the node contains
        // the given search parameter. E.G.: 'value' <=> 'This contains the value'
        if ( ! empty($key) && $key == $needle && strpos($item, $value) !== false){
            return true;
        }
    }

    return $found;
}

像这样调用函数:

$this->findKeyValue($array, $key, $value);

答案 10 :(得分:0)

使用array_map()

$ options 是您要搜索的数组。

$arr = array_map(function($ar) {
    if(array_key_exists('name_of_the_key_you_search_for',$ar)){
        return true;
    }else{
        return false;
    }
},$options  );
var_dump($arr); //just for test, remove in the code

答案 11 :(得分:0)

function checkMultiArrayValue($array) {
        global $test;
        foreach ($array as $key => $item) {

            if(!empty($item) && is_array($item)) {
                checkMultiArrayValue($item);
            }else {
                if($item)
                 $test[$key] = $item;

            }
        }
        return $test;   
    }

 $multiArray = array(    
                0 =>  array(  
                      "country"   => "",  
                      "price"    => 4,  
                      "discount-price" => 0,  
               ),);

$test = checkMultiArrayValue($multiArray);
echo "<pre>"
print_r($test);

将返回具有索引和值的数组

答案 12 :(得分:0)

最简单的方法是这样

$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);

if (array_search(152, array_column($my_array, 'id')) !== FALSE)
  echo 'FOUND!';
else
  echo 'NOT FOUND!';

答案 13 :(得分:0)

您只能将其与两个参数一起使用

function whatever($array, $val) {
    foreach ($array as $item)
        if (isset($item) && in_array($val,$item))
            return 1;
    return 0;
}

答案 14 :(得分:0)

我不知道这对性能是好是坏,但这里有一个替代方案:

$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
    // true
}