我有以下多维$数组:
Array
(
[0] => Array
(
[domain] => example.tld
[type] => 2
)
[1] => Array
(
[domain] => other.tld
[type] => 2
)
[2] => Array
(
[domain] => blaah.tld
[type] => 2
)
)
我只想递归搜索键和值上的所有数组,如果找到键/值则返回true,如果没有找到则返回false。
预期产出:
search_multi_array($array, 'domain', 'other.tld'); // Will return true
search_multi_array($array, 'type', 'other.tld'); // Will return false
search_multi_array($array, 'domain', 'google.com'); // Will return false
我已经找到了一个丑陋的方法,可以针对具有此功能的所有键搜索域名:
function search_multi_array($search_value, $the_array) {
if (is_array($the_array)) {
foreach ($the_array as $key => $value) {
$result = search_multi_array($search_value, $value);
if (is_array($result)) {
return true;
} elseif ($result == true) {
$return[] = $key;
return $return;
}
}
return false;
} else {
if ($search_value == $the_array) {
return true;
}
else
return false;
}
}
任何人都可以做得更好,并以更优雅的方式与关键和价值相匹配吗?
答案 0 :(得分:1)
一种方法是从[domain] =>创建反向映射。 [indices]和[type] => [指数]。除非你进行大量搜索,否则它可能不会为你节省太多。
(提示:您可能希望将其包装到类中以防止映射中出现不一致)
此外,只要您看到类似的内容:
if ($search_value == $the_array) {
return true;
} else {
return false;
}
你总是可以把它变成:
return $search_value == $the_array;
答案 1 :(得分:1)
如果它不超过这两个级别,翻转键/合并会让生活变得更加愉快:
<?php
$data = array
(
'0' => array
(
'domain' => 'example.tld',
'type' => 2
),
'1' => array
(
'domain' => 'other.tld',
'type' => 2,
),
'2' => array
(
'domain' => 'blaah.tld',
'type' => 2
)
);
$altered = call_user_func_array('array_merge_recursive',$data);
var_dump($altered);
var_dump(in_array('other.tld',$altered['domain']));
var_dump(in_array('other.tld',$altered['type']));
var_dump(in_array('google.com',$altered['domain']));
要超越第二级,我们必须遍历所有节点:
$option2 = array();
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($data)) as $key => $value){
$option2[$key][] = $value;
}
var_dump($option2);
答案 2 :(得分:0)
function search_mutli_array($SearchKey, $SearchValue, $Haystack)
{
$Result = false;
if (is_array($Haystack))
{
foreach ($Haystack as $Key => $Value)
{
if (is_array($Value))
{
if (search_mutli_array($SearchKey, $SearchValue, $Value))
{
$Result = true;
break;
}
}
else if ($SearchKey == $Key && $SearchValue == $Value)
{
$Result = true;
break;
}
}
}
return $Result;
}