php 使用递归合并两个多维数组,但不是在整个数据集上

46scxncf  于 2023-02-07  发布在  PHP
关注(0)|答案(1)|浏览(102)

我尝试用**array_merge()将两个数组数据相加。它只是附加到后面。但是较低的级别被忽略。
有没有替代
array_merge()**的方法可以合并user值而不复制color值?
现有阵列数据:

$existingtArr = [
    "A" => [
        "color" => 'red',
        "user" => [
            "Daniel" => ["01:18:08", "04:10:12"],
            "Max" => ["01:04:00"],
            "Serto" => ["02:00:02"],
        ]
    ],
    "B" => [
        "color" => 'blue',
        "user" => [
            "Franz" => ["08:40:52"],
            "Hugo" => ["07:08:58"],
        ]
    ]
];

新阵列数据:

$newArr = [
    "A" => [
        "color" => 'red',
        "user" => [
            "Fabian" => ["06:03:00"], // + 1 user
            "Max" => ["04:10:12"], // + 1 new time 
            "Serto" => ["02:00:02"],
        ]
    ],
    "B" => [
        "color" => 'blue',
        "user" => [
            "Franz" => ["08:40:52", "14:05:32", "20:34:15"], // an older one is available, + 2 new times
            "Hugo" => ["04:10:12"], // + 1 time
        ]
    ],
    "C" => [ // + new whole group
        "color" => 'green',
        "user" => [
            "Maxi" => ["07:08:58", "04:10:12"],
        ]
    ]
];

用新数据补充现有数据:

echo '<pre>';
print_r(array_merge($existingtArr, $newArr));
echo '</pre>';

预期结果数组数据:

$resultArr = [
    "A" => [
        "color" => 'red',
        "user" => [
            "Daniel" => ["01:18:08", "04:10:12"],
            "Fabian" => ["06:03:00"],
            "Max" => ["01:04:00", "04:10:12"],
            "Serto" => ["02:00:02"],
        ]
    ],
    "B" => [
        "color" => 'blue',
        "user" => [
            "Franz" => ["08:40:52", "14:05:32", "20:34:15"],
            "Hugo" => ["07:08:58", "04:10:12"],
        ]
    ],
    "C" => [
        "color" => 'green',
        "user" => [
            "Maxi" => ["07:08:58", "04:10:12"],
        ]
    ]
];
iaqfqrcu

iaqfqrcu1#

您不能简单地对整个数据集调用array_merge_recursive(),因为它们将生成重复的颜色值,但您希望颜色值保持单一,并递归合并用户数据。
为了适应这种逻辑(假设可以用$newArr中的数据简单地改变$existingtArr数组),检查每个字母集是否存在,然后为不存在的字母推送整个集合,或者递归地合并共享的字母集。
代码:(Demo

foreach ($newArr as $letter => $set) {
    if (!isset($existingtArr[$letter])) {
        $existingtArr[$letter] = $set;
    } else {
        $existingtArr[$letter]['user'] = array_merge_recursive(
            $existingtArr[$letter]['user'],
            $set['user']
        );
    }
}
var_export($existingtArr);

相关问题