我需要将两个数组合并为一个,同时将所有键保持在适当位置并列出数组中的值,如本示例所示:
$array1 = array('car' => '3', 'bus' => '2');
$array2 = array('dog' => '1', 'car' => '2', 'bird' => '9');
$merged = array(
'car' => array('3','2'),
'bus' => array('2',null),
'dog' => array(null,'1'),
'bird' => (null,'9')
);
function merge_common_keys(){
$arr = func_get_args();
$num = func_num_args();
$keys = array();
$i = 0;
for ($i=0; $i<$num; ++$i){
$keys = array_merge($keys, array_keys($arr[$i]));
}
$keys = array_unique($keys);
$merged = array();
foreach ($keys as $key){
$merged[$key] = array();
for($i=0; $i<$num; ++$i){
$merged[$key][] = isset($arr[$i][$key]) ? $arr[$i][$key] : null;
}
}
return $merged;
}
用途:
$merged = merge_common_keys($array1,$array2);
PS。它可以处理两个以上的数组,只需传递任意数量的数组作为下一个参数即可。
填充输入数组的单个数组,然后计算数组的数量以确定有多少列应具有默认值
null
。
在循环之前,为所有列声明一个包含空默认值的平面数组。
然后使用嵌套循环为每个新遇到的第二级键建立默认元素,然后在将值推入每个组时交换第一级和第二级键。 演示
$arrays = [
['car' => '3', 'bus' => '2'],
['dog' => '1', 'car' => '2', 'bird' => '9'],
];
$defaults = array_fill(0, count($arrays), null);
$result = [];
foreach ($arrays as $i => $array) {
foreach ($array as $k => $v) {
$result[$k] ??= $defaults;
$result[$k][$i] = $v;
}
}
var_export($result);
输出:
array (
'car' =>
array (
0 => '3',
1 => '2',
),
'bus' =>
array (
0 => '2',
1 => NULL,
),
'dog' =>
array (
0 => NULL,
1 => '1',
),
'bird' =>
array (
0 => NULL,
1 => '9',
),
)