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

Check if a specific value exists at a specific key in any subarray of a multidimensional array

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

换句话说,我需要检查多维数组的单个列中的值。如果该值存在于多维数组中的任何位置,则我想返回true,否则返回false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$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


没有什么比简单的循环要快的了。您可以混合匹配一些数组函数来实现,但是它们也将被实现为循环。

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


** PHP> = 5.5

简单地说,您可以使用此

1
$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
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
$lookup_array=array();

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

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

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

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

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

我尝试过,为我工作,谢谢伙计。

已编辑

注意:它将在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。以下是按复杂程度排序的几种解决方案。

(有关复杂性的简短介绍):O(n)或" big o "表示最坏的情况,其中n表示数组中元素的数量,而O(n)或" little o "表示最好的情况。长期以来,离散数学的故事很短,您只需要担心最坏的情况,并确保它不是n ^ 2n!。与n的增加相比,它更能衡量计算时间的变化,而不是整体计算时间。维基百科上有一篇很好的文章,介绍了计算的时间复杂性。

如果经验教给我任何东西,那就是花太多时间优化程序的时间太少了,这显然是在浪费时间,因为花点时间做某事-任何事情-都更好。

解决方案0:O(n) / o(1)复杂度:

此解决方案的最佳情况是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:O(n) / o(n)复杂度:

无论匹配值在哪里,此解决方案都必须遍历整个数组,因此它始终是遍历该数组的n个迭代。

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:O(n log n) / o(n log n)复杂度:

log n的来源是散列插入; n哈希插入= n * log n。在末尾有一个哈希查找,这是另一个log n,但不包括在内,因为这只是离散数学的工作方式。

1
2
3
4
5
$existence_hash = [];
foreach ($my_array as $sub_array) {
    $existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];


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

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

stripos(serialize($my_array),$needle)

这似乎对我有用。


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

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

尝试以下代码。对于任何类型的多维数组搜索,它应该都能正常工作。

在这里您可以看到实况演示示例

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