在 PHP 中有效合并嵌套数组,同时保留唯一的键值对

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

我正在开发一个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 中的此类数组合并提出更高效、更优雅的解决方案吗?是否有内置函数或完善的模式可以有效地处理这种情况,特别是在处理更大、更复杂的数组时?

php arrays algorithm performance merge
1个回答
0
投票

这是我想到的第一件事。

  1. 将单独的数组作为单独的参数传递到递归函数中。
  2. 接收第一个数组作为“主”数组,然后循环遍历后续数组并根据具体情况确定最佳操作方案。
  3. 如果迭代数组中的某个级别的数据是索引数组,则只需将所有值推入主节点的相关级别即可。如果不是索引数组,则进行基于键的声明(可能递归)。

代码:(演示

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));

我不知道这是否仍然会带来性能问题,但它可以按照您的描述正确处理数据。

© www.soinside.com 2019 - 2024. All rights reserved.