2011-08-09 142 views
51

只是想知道,如果你能给我这个手:PHP:检查是否值和关键在多维数组存在

我有一个多维数组...

$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的任何值。我不需要回显或使用任何值。我只需要检查(返回true)数组是否有ID“key”和值“152”的记录。

+0

所以你发现周围的最好方法? –

回答

58

没有比简单的循环更快的了。你可以混合使用一些数组函数来完成它,但它们也只是作为一个循环来实现。

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

这对单个数组很好,但如果你正在寻找多维数组,然后检查我的修改版本 –

7

如果你不得不做出很多的“ID”查找,它应该是非常快,你应该使用含有所有的“IDS”作为密钥的第二阵列:

​​

现在你可以检查现有ID非常快,例如:

echo (isset($lookup_array[152]))?'yes':'no'; 
2
return 0 < count(
    array_filter(
     $my_array, 
     function ($a) { 
      return array_key_exists('id', $a) && $a['id'] == 152; 
     } 
    ) 
); 

注:array_key_exists调用是可选的。它只是适合代码的坚强。

17

这里是丹·格罗斯曼的回答的更新版本,将多维数组照顾(我是什么后):

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

** PHP> = 5.5

根本u可以使用这个

$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')); 
+2

为什么不简单地'$ ids = array_column($ array,'id','id');'然后'isset ($编号[40489])'? –

+0

嘿,你是否介意更新你的答案并实施来自Elias的评论? – leymannx

0

使用array_map()

$选项是您正在搜索的数组。

$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 
4

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

让我们说你的2-d数组名$ 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'的内部索引,才有你的$值。如果key_name'name'也具有$值,那么其他一些答案也可能会导致真值

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

一个很好的解决方案可以通过@Elias Van Ootegan在评论即提供一个:

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

我尝试过了,为我工作,谢谢哥们。

编辑

注:这将在PHP工作5.5+

+1

请注意'array_column'需要PHP 5.5+ - http://php.net/manual/en/function.array-column.php –