【问题标题】:Merge two multidimensional arrays based on new keys only仅基于新键合并两个多维数组
【发布时间】:2018-05-08 17:07:57
【问题描述】:

有没有办法合并这些数组:

// saved settings by the user
$arr1 = [
    'options' => [
        'first' => 1,
        'second' => 2,
        'third' => 3,
    ]
];

// new option schema (new keys added)
$arr2 = [
    'options' => [
        'first' => 1,
        'second' => 212,
        'fourth' => 4
    ]
];

并得到如下输出:

$arr3 = [
    'options' => [
        'first' => 1, // nothing do to, "first" key already exists
        'second' => 2, // nothing to do, "second" key exists (user already saved "second" with value 2, so we omit value 212)
         // "third" option got removed from new schema, no longer needed in the app, so may be removed from User settings as well
        'fourth' => 4 // this key is new, so let's add it to the final result
    ]
];

基本上我尝试了array_mergearray_merge_recursive,但是它们合并了所有键而不是仅合并新键,因此它会覆盖用户设置。

当然,源数组要复杂得多,里面有很多多维数组。

有没有办法让它变得简单,或者图书馆可以处理它?

【问题讨论】:

  • 你在$arr3中想要的不是合并的概念,你需要通过循环或类似的结构手动实现
  • 感谢 Abdo,我认为可能已经有现成的解决方案,如果没有,我会自己做

标签: php array-merge


【解决方案1】:

这可以通过递归函数来完成。新结构(本例中为$arr2)定义了结果中存在的键。如果旧结构在新结构中的对应键上有值,则将使用它。如果不是,则将使用新结构中的值。因为您只查看新结构中存在的键,所以不会包含旧结构中不再存在的任何键。

function update($newKeys, $oldData) {
    $result = [];

    // iterate only new structure so obsolete keys won't be included
    foreach ($newKeys as $key => $value) {

        // use the old value for the new key if it exists
        if (isset($oldData[$key])) {

            if (is_array($oldData[$key]) && is_array($value)) {
                // if the old and new values for the key are both arrays, recurse
                $result[$key] = merge($value, $oldData[$key]);
            } else {
                // otherwise, just use the old value
                $result[$key] = $oldData[$key];
            }

        // use the new value if the key doesn't exist in the old values
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}

$result = update($arr2, $arr1);

我只会在完全关联的结构上使用它。如果任何内部数组是键无关紧要的基本索引数组,则必须在函数中添加一些内容以防止将它们弄乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2018-04-01
    相关资源
    最近更新 更多