我正在开发一个PHP项目,我需要经常合并多个嵌套数组。关键点是我想在数组中保留唯一的键值对,优先考虑合并序列中后面数组中的值。
这是一个简化的示例:
$array1 = [
'fruits' => [
'apple' => 'red',
'banana' => 'yellow'
],
'numbers' => [1, 2]
];
$array2 = [
'fruits' => [
'orange' => 'orange',
'apple' => 'green' // Should overwrite 'red'
],
];
$array3 = [
'numbers' => [2, 3, 4], // Should extend, not replace
'colors' => ['blue', 'purple'] // New key should be added
];
// Desired Output:
$mergedArray = [
'fruits' => [
'apple' => 'green',
'banana' => 'yellow',
'orange' => 'orange'
],
'numbers' => [1, 2, 3, 4],
'colors' => ['blue', 'purple']
];
我当前的方法(对于大型数组效率低下):
PHP
function mergeNestedArraysInefficient($arrays) {
$mergedArray = [];
foreach ($arrays as $array) {
foreach ($array as $key => $value) {
if (is_array($value)) {
// Nested array - handle recursively
if (!isset($mergedArray[$key])) {
$mergedArray[$key] = $value;
} else {
$mergedArray[$key] = mergeNestedArraysInefficient([$mergedArray[$key], $value]);
}
} else {
// Simple value - overwrite if key exists
$mergedArray[$key] = $value;
}
}
}
return $mergedArray;
}
问题:
任何人都可以为 PHP 中的此类数组合并提出更高效、更优雅的解决方案吗?是否有内置函数或完善的模式可以有效地处理这种情况,特别是在处理更大、更复杂的数组时?
这是我想到的第一件事。
代码:(演示)
function mergeNestedArraysInefficient(array $array, array ...$otherArrays) {
foreach ($otherArrays as $other) {
if (array_is_list($other)) {
array_push($array, ...$other);
continue;
}
foreach ($other as $k => $v) {
if (is_array($v)) {
$array[$k] = !key_exists($k, $array) ? $v : mergeNestedArraysInefficient($array[$k], $v);
} else {
$array[$k] = $v;
}
}
}
return $array;
}
var_export(mergeNestedArraysInefficient($array1, $array2, $array3));
我不知道这是否仍然会带来性能问题,但它可以按照您的描述正确处理数据。