我需要在任何索引子数组中搜索多维数组中的特定值。
换句话说,我需要检查多维数组的单列以获取值。 如果该值存在于多维数组中的任何位置,我想返回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 ^ 2
或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 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'];
我看到这篇文章时也想做同样的事情,并提出了我自己的解决方案,我想为这个页面的未来访问者提供(看看这样做是否会带来我没有预见到的任何问题(。
如果你想获得一个简单的true
或false
输出,并且想要用一行代码来做到这一点,没有函数或循环,你可以序列化数组,然后使用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);