69

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

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

4

15 回答 15

84

没有什么比一个简单的循环更快的了。您可以混合和匹配一些数组函数来做到这一点,但它们也只会被实现为循环。

function whatever($array, $key, $val) {
    foreach ($array as $item)
        if (isset($item[$key]) && $item[$key] == $val)
            return true;
    return false;
}
于 2011-08-09T02:43:37.577 回答
27

** PHP >= 5.5

你可以用这个

$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'));
于 2016-06-21T04:02:21.830 回答
25

这是丹格罗斯曼答案的更新版本,它将迎合多维数组(我所追求的):

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;
}
于 2015-03-24T13:19:29.523 回答
25

最简单的方法是这样的:

$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!';
}
于 2018-12-12T06:01:53.283 回答
8

如果您必须进行大量“id”查找并且它应该非常快,您应该使用包含所有“id”作为键的第二个数组:

$lookup_array=array();

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

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

echo (isset($lookup_array[152]))?'yes':'no';
于 2011-08-09T02:58:45.570 回答
5

一个好的解决方案可以由@Elias Van Ootegan以下评论提供:

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

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

已编辑

注意:它适用于 PHP 5.5+

于 2017-01-06T06:48:40.083 回答
4

TMTOWTDI。以下是按复杂程度排列的几种解决方案。

(以下是关于复杂性的简短入门):O(n)或“大 o”表示最坏情况,其中n表示数组中元素的数量,o(n)或“小 o”表示最佳情况。长长的离散数学简而言之,您只需要真正担心最坏的情况,并确保它不是n ^ 2or n!。它更多地衡量计算时间的变化,n而不是整体计算时间。维基百科有一篇关于计算时间复杂度的好文章

如果经验教会了我什么,那就是花太多时间优化程序的 little-o 显然是浪费时间,最好花在做某事——任何事情——更好。

解决方案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 nn哈希插入 = n * log n. 最后有一个哈希查找,这是另一个log n,但它不包括在内,因为这就是离散数学的工作原理。

$existence_hash = [];
foreach ($my_array as $sub_array) {
    $existence_hash[$sub_array['id']] = true;
}
return @$existence_hash['152'];
于 2011-08-09T03:13:15.490 回答
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

于 2016-08-11T15:28:15.397 回答
2

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

如果你想得到一个简单的truefalse输出,并且想用一行代码而不用函数或循环来做到这一点,你可以序列化数组,然后用它stripos来搜索值:

stripos(serialize($my_array),$needle)

它似乎对我有用。

于 2020-05-26T13:20:25.807 回答
0

您可以仅使用两个参数

function whatever($array, $val) {
    foreach ($array as $item)
        if (isset($item) && in_array($val,$item))
            return 1;
    return 0;
}
于 2020-06-30T07:15:35.543 回答
0

isset 与 array_key_exits 之间的区别isset() 和 array_key_exists() 有什么区别?

== vs === PHP 相等(== 双等号)和身份(=== 三等号)比较运算符有何不同

function specificValue(array $array,$key,$val) {
    foreach ($array as $item)
        if (array_key_exits($item[$key]) && $item[$key] === $val)
            return true;
    return false;
}
于 2021-10-06T09:20:40.533 回答
0

我不知道这对性能来说是好是坏,但这里有一个替代方案:

$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
    // true
}
于 2021-07-10T23:59:37.220 回答
-1

试试下面的代码。它应该适用于任何类型的多维数组搜索。

在这里您可以看到LIVE DEMO 示例

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;
}
于 2016-12-02T16:14:32.167 回答
-2
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 "<pre>"
print_r($test);

将返回具有索引和值的数组

于 2018-05-16T08:37:31.497 回答
-3

我编写了以下函数以确定多维数组是否部分包含某个值。

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);
于 2016-05-25T12:45:53.680 回答