【问题标题】:Merge multidimensional array (recursive) but skip duplicate values in PHP合并多维数组(递归)但在 PHP 中跳过重复值
【发布时间】:2018-10-12 07:16:35
【问题描述】:

我有两个要合并的多维数组,但是我想在合并期间跳过相同的值。我尝试了几种在网上找到的不同方法,但对我来说没有任何帮助。

我的初始数组比这个大很多,但这里我只是举个例子:

$array1 = [
    "aaa" => [
        "aa1"=> [
            "key1"=> "value1",
            "key2"=> "value2",
        ],
        "bbb"=> [
            "bb1",
            "bb2",
        ],
        "ccc"=> [
            "cc1",
        ],
    ],
    "ooo" => [
        "oo1"
    ]
];

还有一个,我想合并到第一个:

$array2 = [
    "aaa" => [
        "bbb"=> [
            "bb2",
        ],
        "ccc"=> [
            "cc2",
        ],
    ],
];

array_merge_recurisive 的 print_r,使用如下方法: print_r(array_merge_recursive($array1, $array2));

Array
(
    [aaa] => Array
        (
            [aa1] => Array
                (
                    [key1] => value1
                    [key2] => value2
                )

            [bbb] => Array
                (
                    [0] => bb1
                    [1] => bb2
                    [2] => bb2
                )

            [ccc] => Array
                (
                    [0] => cc1
                    [1] => cc2
                )

        )

    [ooo] => Array
        (
            [0] => oo1
        )

)

所以,在结果中你可以看到数组 bbb 有两个 bb2 值,但我只需要一个

【问题讨论】:

  • 你试过$arr = array_unique (array_merge_recursive($arr1, $arr2));
  • 检查这个:array_merge_recursive。注意这一行:但是,如果数组具有相同的数字键,则后面的值不会覆盖原始值,而是会被追加。
  • @lovelace 是的,我试过了,但对我的情况没有帮助。

标签: php arrays recursion array-merge


【解决方案1】:

以下函数将递归删除数组的重复值(编辑:仅适用于非关联键):

function array_unique_recursive(array $arr) {
  if (array_keys($arr) === range(0, count($arr) - 1)) {
    $arr = array_unique($arr, SORT_REGULAR);
  }

  foreach ($arr as $key => $item) {
    if (is_array($item)) {
      $arr[$key] = array_unique_recursive($item);
    }
  }

  return $arr;
}

你可以在array_merge_recursive之后调用它。

【讨论】:

  • 是的,它是解决方案之一。我尝试一步完成。
  • @Kolesar,用“一步”定义你的意思。此外,由于这是一种解决方案,因此可以接受。您似乎建议您已经知道几种解决方案。在这种情况下,您的问题与 StackOverflow 无关。你可能想看看CodeReview,看看你的问题是否会成为话题。
  • 我现在尝试了这种方法,如果我们有类似的情况,它就不起作用了: "bbb"=> [ "bb1", "bb2", ], "ccc"=> [ " bb1", "bb2", ], ccc 在这种情况下将被删除,因为具有“相同的数组内容”
  • @Kolesar 编辑了我的帖子。
【解决方案2】:

使用array_replace_recursive 而不是array_merge_recursive

【讨论】:

    【解决方案3】:

    你可以试试这个

    array_unique(array_merge_recursive($array1,$array2), SORT_REGULAR);

    【讨论】:

    • 请说明如何解决 OP 的问题。
    • 如果您尝试使用第一篇文章中的数组,您会发现这也不起作用。
    猜你喜欢
    • 2014-10-31
    • 2015-06-04
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多