如何在 Laravel 集合合并时保留嵌套数组

How to keep nested arrays on Laravel collection merge

我快要疯了。

鉴于我有 2 个数组,例如


$array1 = [
    "data_to_merge" => ["2020-03-11 16:00:00", "2020-03-24 14:00:00"],
    "data_to_merge_past_year" => ["2019-03-11 16:00:00"],
];

$array2 = [
    "data_to_merge" => [],
    "data_to_merge_past_year" => ["2018-03-11 14:00:00"],
];

我的目标是得到像

这样的结果
all: [
       "data_to_merge" => [
         "2020-03-11 16:00:00",
         "2020-03-24 14:00:00"
       ],
       "data_to_merge_past_year" => [
         "2018-03-11 14:00:00",
         "2018-03-11 16:00:00",
       ],
     ],

我试过简单的

$result = collect($array1)->merge(collect($array2));

但是通过这种方法,它将从我的第一个数组中删除 data_to_merge 中的值。有什么 Laravel 方法可以得到那个结果吗?可以超过2个数组,只是为了演示。

这是我的完整示例,基本相同


$array1 = [
    "host" => "blablubb",
    "data_to_merge" => [
      "2020-03-11 16:00:00",
      "2020-03-24 14:00:00"
    ],
    "data_to_merge_past_year" => [
      "2019-03-11 16:00:00"
    ],
];

$array2 = [
    "host" => "blablubb",
    "data_to_merge" => [],
    "data_to_merge_past_year" => [
      "2018-03-11 16:00:00"
    ],
];

$array3 = [
    "host" => "blablubb",
    "data_to_merge" => [],
    "data_to_merge_past_year" => [],
];

$array4 = [
    "host" => "blablubb",
    "data_to_merge" => [
      "2020-03-04 14:00:00",
      "2020-03-04 17:00:00"
    ],
    "data_to_merge_past_year" => [],
];



$all = collect([$array1, $array2, $array3, $array4]);

$all
    ->groupBy('host')
    ->map(function ($item) {
        if (count($item) > 1) {
            $result = collect([]);

            foreach ($item as $subItem) {
                $result = $result->merge($subItem);
            }
            return $result;
        }

        return $item->first();
    })
    ->values()
    ->toArray();

谢谢大家!

您可以为此使用 mergeRecursive

$array1 = [
    "data_to_merge" => ["2020-03-11 16:00:00", "2020-03-24 14:00:00"],
    "data_to_merge_past_year" => ["2019-03-11 16:00:00"],
];

$array2 = [
    "data_to_merge" => [],
    "data_to_merge_past_year" => ["2018-03-11 14:00:00"],
];

$result = collect($array1)->mergeRecursive(collect($array2));

结果:

Illuminate\Support\Collection {#1278 ▼
  #items: array:2 [▼
    "data_to_merge" => array:2 [▼
      0 => "2020-03-11 16:00:00"
      1 => "2020-03-24 14:00:00"
    ]
    "data_to_merge_past_year" => array:2 [▼
      0 => "2019-03-11 16:00:00"
      1 => "2018-03-11 14:00:00"
    ]
  ]
}

来自文档:

The mergeRecursive method merges the given array or collection recursively with the original collection. If a string key in the given items matches a string key in the original collection, then the values for these keys are merged together into an array, and this is done recursively:

$collection = collect(['product_id' => 1, 'price' => 100]);

$merged = $collection->mergeRecursive(['product_id' => 2, 'price' => 200, 'discount' => false]);

$merged->all();

// ['product_id' => [1, 2], 'price' => [100, 200], 'discount' => false]