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


How to check if a specific value exists at a specific key in any subarray of a multidimensional array?

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

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

最简单的方法是:

$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!';
}

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

以下是Dan Grossman答案的更新版本,它将迎合多维数组(我所追求的(:

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

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

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

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

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

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

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

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

编辑

注意:它将在 PHP 5.5+ 中工作

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

(以下是关于复杂性的简短入门(:O(n)或"大o"表示最坏情况,其中n表示数组中元素的数量,o(n)或"小o"表示最佳情况。长离散数学短说,你只需要真正担心最坏的情况,并确保它不是n ^ 2n!。它更像是计算时间随着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 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'];

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

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

stripos(serialize($my_array),$needle)

它似乎对我有用。

就像你的问题一样,这实际上是一个简单的二维数组,不是更好吗?看一看——

假设您的二维数组名称 $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);

如您所见,它实际上只检查是否有任何只有"id"的内部key_name索引具有您的$value。如果"名称"也有 $value

我不知道

这对性能是更好还是更差,但这里有一个替代方案:

$keys = array_map(function($element){return $element['id'];}, $my_array);
$flipped_keys = array_flip($keys);
if(isset($flipped_keys[40489]))
{
    // true
}

您可以创建子数组队列并循环每个子数组:

function existsKeyValue($myArray, $key, $value) {
    $queue = [$myArray]; //creating a queue of a single element, which is our outermost array
    //when we reach the count of the queue we looped all inner loops as well and failed to find the item
    for ($index = 0; $index < count($queue); $index++) {
        //Looping the current array, finding the key and the value
        foreach ($queue[$index] as $k => &$v) {
            //If they match the search, then we can return true
            if (($key === $k) && ($value === $v)) {
                return true;
            }
            //We need to make sure we did not already loop our current array to avoid infinite cycles
            if (is_array($v)) $queue[]=$v;
        }
    }
    return false;
}
$my_array = array(    
    0 =>  array(  
        "name"   => "john",  
        "id"    =>  4  
    ),  
    1   =>  array(  
        "name" =>  "mark",  
        "id" => 152  
    ), 
    2   =>  array(  
        "name" =>  "Eduard",  
        "id" => 152  
    )
);
echo var_dump(existsKeyValue($my_array, 'id', 152));

array_column返回数组中单列的值,我们可以通过in_array

if (in_array(152, array_column($my_array, 'id'))) {
    echo 'FOUND!';
} else {
    echo 'NOT FOUND!';
}

只需使用array_column,如下例所示:

$my_array = [
    [
        "name"  => "john",  
        "id"    =>  4  
    ],  
    [
        "name"  =>  "mark",  
        "id"    => 152  
    ], 
    [
        "name"  =>  "Eduard",  
        "id"    => 152  
    ]
];
var_dump(in_array(152, array_column($my_array, 'id'))); // true

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

在这里你可以看到现场演示示例

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

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

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

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

== 与 ===

之间的区别 PHP 相等(== 双等(和恒等(=== 三等(比较运算符有何不同?

function specificValue(array $array,$key,$val) {
    foreach ($array as $item)
        if (array_key_exits($item[$key]) && $item[$key] === $val)
            return true;
    return false;
}
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);

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

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

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