检查多维数组的任何子数组中特定键处是否存在特定值

问题描述 投票:57回答:11

我需要在多维数组中搜索任何索引子数组中的特定值。

换句话说,我需要检查多维数组的单个列中的值。如果该值存在于多维数组中的任何位置,则我想返回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

php arrays search multidimensional-array array-column
11个回答
71
投票
function whatever($array, $key, $val) { foreach ($array as $item) if (isset($item[$key]) && $item[$key] == $val) return true; return false; }

23
投票
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; }

14
投票
简单地说,您可以使用此

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

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

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

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

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

,则此处的其他答案也可能为true

4
投票
$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!';

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

我尝试过,为我工作,谢谢朋友。

已编辑

注意:它将在PHP 5.5+中运行


3
投票
(有关复杂性的简短介绍):O(n)或“大o”表示

最差情况,其中n表示数组中元素的数量,o(n)或“小o”表示< [最佳案例方案。长期以来,离散数学的故事很短,您

只需要担心最坏的情况,并确保它不是n ^ 2n!。随着n的增加,它更多地是计算时间变化的度量,而不是整体计算时间。 Wikipedia has a good article about computational aka time complexity

[如果经验教给我任何东西,那就是花太多时间优化程序很少-明显是浪费时间,花点时间做某事-任何事情-更好。解决方案0: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;
        }
    )
);

解决方案2: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'];

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

-2
投票
这样调用函数:

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


-2
投票
© www.soinside.com 2019 - 2024. All rights reserved.