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

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

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

162368 次浏览

没有什么比一个简单的循环更快的了。您可以混合和匹配一些数组函数来完成这项工作,但是它们也将作为一个循环实现。

function whatever($array, $key, $val) {
foreach ($array as $item)
if (isset($item[$key]) && $item[$key] == $val)
return true;
return false;
}

如果需要进行大量的“ id”查找,而且查找速度应该很快,那么应该使用包含所有“ id”的第二个数组作为键:

$lookup_array=array();


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

现在你可以很快地检查一个现有的 id,例如:

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

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

(简短的复杂性入门如下) : O(n)或“大 o”意味着 最糟糕的情况下的场景,其中 n意味着数组中元素的数量,而 o(n)或“小 o”意味着 最好的情况下的场景。长的离散数学故事短,你 只需要担心最坏的情况,并确保它不是 n ^ 2n!。与其说它是整个计算时间,不如说它是 n增加时计算时间变化的度量。Wikipedia 有一篇关于计算时间复杂性的好文章.

如果说经验教会了我什么的话,那就是花费太多时间优化你的程序的小 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'];

下面是 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;
}

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

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

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

在你的问题中,哪个实际上是一个简单的2-D 数组不是更好吗

假设您的2-D 数组名为 $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

尝试使用下面的代码。它应该可以很好地用于任何类型的多维数组搜索。

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

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

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

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

我试过了,为自己工作,谢谢你,伙计。

编辑

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

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

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

最简单的方法是:

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

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

如果你想得到一个简单的 true或者 false输出,并且只需要一行代码而不需要函数或者循环,你可以序列化这个数组,然后使用 stripos来搜索这个值:

stripos(serialize($my_array),$needle)

看起来对我有用。

只能使用两个参数

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

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

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

< strong > isset 与 array _ key _ exit 之间的区别 Isset ()和 array _ key _ vis ()之间的区别是什么?

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

array_column返回数组中单列的值,我们可以通过 in_array搜索这些值的特定值

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

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

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