我需要在多维数组中搜索任何索引子数组中的特定值。
换句话说,我需要检查多维数组的单个列中的值。如果该值存在于多维数组中的任何位置,则我想返回true
,否则返回false
$my_array = array(
0 => array(
"name" => "john",
"id" => 4
),
1 => array(
"name" => "mark",
"id" => 152
),
2 => array(
"name" => "Eduard",
"id" => 152
)
);
我想知道最快最有效的方法来检查数组$my_array
是否包含键为“ id”的值。例如,如果id => 152
在多维数组中的任意位置,我想要true
。
function whatever($array, $key, $val) {
foreach ($array as $item)
if (isset($item[$key]) && $item[$key] == $val)
return true;
return false;
}
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;
}
$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'));
$lookup_array=array();
foreach($my_array as $arr){
$lookup_array[$arr['id']]=1;
}
现在,您可以非常快速地检查现有ID,例如:
echo (isset($lookup_array[152]))?'yes':'no';
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
,则此处的其他答案也可能为true$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!';
$ids = array_column($array, 'id', 'id');
echo isset($ids[40489])?"Exist":"Not Exist";
我尝试过,为我工作,谢谢朋友。
已编辑
注意:它将在PHP 5.5+中运行
O(n)
或“大o”表示最差情况,其中n
表示数组中元素的数量,o(n)
或“小o”表示< [最佳案例方案。长期以来,离散数学的故事很短,您
只需要担心最坏的情况,并确保它不是n ^ 2
或n!
。随着n
的增加,它更多地是计算时间变化的度量,而不是整体计算时间。 Wikipedia has a good article about computational aka time complexity。
O(n) / o(1)
复杂度:此解决方案的最佳情况是进行1个比较-循环进行1次迭代,但仅在匹配值位于数组的位置0时
。最坏的情况是它不在数组中,因此必须遍历数组的每个元素。foreach ($my_array as $sub_array) {
if (@$sub_array['id'] === 152) {
return true;
}
}
return false;
解决方案1:O(n) / o(n)
复杂度:无论匹配值在哪里,该解决方案都必须遍历整个数组,因此,总是要通过数组进行n
次迭代。
return 0 < count(
array_filter(
$my_array,
function ($a) {
return array_key_exists('id', $a) && $a['id'] == 152;
}
)
);
O(n log n) / o(n log n)
复杂度:散列插入是log n
的来源; n
哈希插入= n * log n
。在末尾有一个哈希查找,它是另一个log n
,但由于离散匹配而未包括在内。
$existence_hash = [];
foreach ($my_array as $sub_array) {
$existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];
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;
}
$this->findKeyValue($array, $key, $value);