Check if a specific value exists at a specific key in any subarray of a multidimensional array
我需要在多维数组中搜索任何索引子数组中的特定值。
换句话说,我需要检查多维数组的单个列中的值。如果该值存在于多维数组中的任何位置,则我想返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
我想知道最快最有效的方法来检查数组
没有什么比简单的循环要快的了。您可以混合匹配一些数组函数来实现,但是它们也将被实现为循环。
1 2 3 4 5 6 | function whatever($array, $key, $val) { foreach ($array as $item) if (isset($item[$key]) && $item[$key] == $val) return true; return false; } |
这是Dan Grossman的答案的更新版本,该答案将满足多维数组(我所追求的):
1 2 3 4 5 6 7 8 9 10 11 |
** PHP> = 5.5
简单地说,您可以使用此
1 |
让我们假设这个多维数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | $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')); |
最简单的方法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $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!'; |
如果必须进行大量的" id "查找,并且应该非常快,则应使用包含所有" ids "的第二个数组作为键:
1 2 3 4 5 |
现在您可以非常快速地检查现有ID,例如:
1 |
一个好的解决方案可以是
1 2 |
我尝试过,为我工作,谢谢伙计。
已编辑
注意:它将在PHP 5.5中运行
就像您的问题一样,实际上这是一个简单的二维数组会更好吗?看看-
假设您的二维数组名称$ my_array,要查找的值是$ id
1 2 3 4 5 6 7 8 9 | function idExists($needle='', $haystack=array()){ //now go through each internal array foreach ($haystack as $item) { if ($item['id']===$needle) { return true; } } return false; } |
并命名为:
1 | idExists($id, $my_array); |
如您所见,它实际上仅检查是否只有key_name \\'id \\'的内部索引具有您的$ value。如果key_name \\'name \\'也具有$ value
,则此处的其他答案也可能为true
TMTOWTDI。以下是按复杂程度排序的几种解决方案。
(有关复杂性的简短介绍):
如果经验教给我任何东西,那就是花太多时间优化程序的时间太少了,这显然是在浪费时间,因为花点时间做某事-任何事情-都更好。
解决方案0:
此解决方案的最佳情况是1个比较-循环执行1次迭代,但前提是匹配值位于数组的位置0。最坏的情况是它不在数组中,因此必须遍历数组的每个元素。
1 2 3 4 5 6 | foreach ($my_array as $sub_array) { if (@$sub_array['id'] === 152) { return true; } } return false; |
解决方案1:
无论匹配值在哪里,此解决方案都必须遍历整个数组,因此它始终是遍历该数组的
1 2 3 4 5 6 7 8 | return 0 < count( array_filter( $my_array, function ($a) { return array_key_exists('id', $a) && $a['id'] == 152; } ) ); |
解决方案2:
1 2 3 4 5 | $existence_hash = []; foreach ($my_array as $sub_array) { $existence_hash[$sub_array['id']] = true; } return @$existence_hash['152']; |
我偶然发现了这篇文章,希望做同样的事情,并提出了自己的解决方案,我想为该页面的未来访问者提供该解决方案(看看这样做是否会带来我没有预见的任何问题)。
如果要获取简单的
这似乎对我有用。
您只能将其与两个参数一起使用
1 2 3 4 5 6 |
尝试以下代码。对于任何类型的多维数组搜索,它应该都能正常工作。
在这里您可以看到实况演示示例
1 2 3 4 5 6 7 8 9 10 11 12 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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"[cc lang="php"]" print_r($test); |
将返回具有索引和值的数组
我写了以下函数,以确定多维数组是否部分包含某个值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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; } |
这样调用函数:
1 | $this->findKeyValue($array, $key, $value); |