将多个平面关联数组合并并转置为具有空值(其中缺少列值)的二维数组

问题描述 投票:0回答:3

我需要将两个数组合并为一个,同时将所有键保持在适当位置并列出数组中的值,如本示例所示:

$array1 = [
    'car' => '3',
    'bus' => '2'
];
$array2 = [
    'dog' => '1',
    'car' => '2',
    'bird' => '9'
];  

想要的结果:

$merged = [
    'car' =>  ['3',  '2'], 
    'bus' =>  ['2',  null],
    'dog' =>  [null, '1'],
    'bird' => [null, '9']
];
php arrays multidimensional-array merge transpose
3个回答
14
投票
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。它可以处理两个以上的数组,只需传递任意数量的数组作为下一个参数即可。


1
投票

有这样的事吗? http://php.net/array_merge_recursive


0
投票

填充输入数组的单个数组,然后计算数组的数量以确定有多少列应具有默认值

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',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.