如果您计划在键(字符串、数字等)中只包含原始值,这将起作用:
<?php
function array_combine_keys($a, $b) {
$c = $a;
foreach ($b as $k=>$v) {
// Value can be only primitive, not an array itself
if (isset($a[$k]) && $a[$k] !== $v) {
$c[$k] = array($a[$k], $v);
} else {
$c[$k] = $v;
}
}
return $c;
}
$a = array('a' => '1', 'b' => '2');
$b = array('a' => '1', 'b' => '3', 'c' => '5');
var_dump(array_combine_keys($a, $b));
?>
array(3) {
["a"]=>
string(1) "1"
["b"]=>
array(2) {
[0]=>
string(1) "2"
[1]=>
string(1) "3"
}
["c"]=>
string(1) "5"
}
一种更通用的方法是在值中也允许数组,并确保键始终是数组,这意味着我们不需要额外的逻辑来检查键是数组还是遍历时不是数组结果。(+) 是两个数组的并集。
<?php
function array_combine_keys($a, $b) {
$c = $a;
foreach ($b as $k=>$v) {
if (!is_array($v)) {
$v = array($v);
}
if (isset($a[$k])) {
$av = $a[$k];
if (!is_array($av)) {
$av = array($av);
}
$c[$k] = $av + $v;
} else {
$c[$k] = $v;
}
}
return $c;
}
$a = array('a' => '1', 'b' => array('2', '4'));
$b = array('a' => '1', 'b' => array('3'), 'c' => '5');
var_dump(array_combine_keys($a, $b));
?>
array(3) {
["a"]=>
array(1) {
[0]=>
string(1) "1"
}
["b"]=>
array(2) {
[0]=>
string(1) "2"
[1]=>
string(1) "4"
}
["c"]=>
array(1) {
[0]=>
string(1) "5"
}
}