我知道array_intersect_key
会在以下任何参数中返回第一个参数的重复键。
但是我想知道哪一种最简单的方法可以同时在两个以上的数组中找到重复键? PHP是否提供这样的功能,还是需要多次调用?
鉴于
$a1 = array('hello'=>1, 'tag'=>1);
$a2 = array('moin'=>1);
$a3 = array('moin'=>1, 'tag'=>1);
所有三个阵列中的重复键都是moin
和tag
。
到目前为止,我一直认为在每个可能的参数对上调用array_intersect_keys(在接受2-n个数组作为参数的函数中),但实际上找到所有可能的组合都有问题。也许还有一种更容易的方法。
答案 0 :(得分:3)
这是我制作的自定义功能,可以满足您的需求:
function array_duplicate_keys()
{
$keys = array();
foreach(func_get_args() as $arr)
{
if(!is_array($arr))
{
continue;
}
foreach($arr as $key => $v)
{
if(!isset($keys[$key]))
{
$keys[$key] = -1;
}
$keys[$key]++;
}
}
return array_keys(array_filter($keys));
}
$a1 = array('hello'=>1, 'tag'=>1);
$a2 = array('moin'=>1);
$a3 = array('moin'=>1, 'tag'=>1);
/*
print_r(array_duplicate_keys($a1, $a2, $a3));
Array
(
[0] => tag
[1] => moin
)
*/
答案 1 :(得分:2)
我认为你的想法很好 - 在每个可能的数组组合上调用它。两个嵌套的for循环应该足以获得所有组合:
function array_duplicate_keys() {
$arrays = func_get_args();
$count = count($arrays);
$dupes = array();
// Stick all your arrays in $arrays first, then:
for ($i = 0; $i < $count; $i++) {
for ($j = $i+1; $j < $count; $j++) {
$dupes += array_intersect_key($arrays[$i], $arrays[$j]);
}
}
return array_keys($dupes);
}
答案 2 :(得分:1)
$a1 = array('hello'=>1, 'tag'=>1);
$a2 = array('moin'=>1);
$a3 = array('moin'=>1, 'tag'=>1);
$all = array($a1, $a2, $a3);
function pair_duplicate_keys($arrays) {
$keys = array();
$result = array();
foreach ($arrays as $array) {
foreach ($array as $key => $value) {
if (!isset($keys[$key])) {
$keys[$key] = 1;
} else {
$result[$key] = 1;
}
}
}
return array_keys($result);
}
print_r(pair_duplicate_keys($all));
输出
Array
(
[0] => moin
[1] => tag
)
答案 3 :(得分:1)
丑陋,但是完成了工作:
function array_duplicate_keys() {
return array_keys(array_filter(array_count_values(call_user_func_array('array_merge', array_map('array_keys', func_get_args()))), function ($num) {
return $num > 1;
}));
}
$a1 = array('hello'=>1, 'tag'=>1);
$a2 = array('moin'=>1);
$a3 = array('moin'=>1, 'tag'=>1);
print_r(
array_duplicate_keys($a1, $a2, $a3)
);
输出:
Array
(
[0] => tag
[1] => moin
)
答案 4 :(得分:1)
您只需拨打array_merge function即可:
$a = array_merge($a1, $a2, $a3);
print_r($a);
Array
(
[hello] => 1
[tag] => 1
[moin] => 1
)