猿问

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

我快要疯了。


鉴于我有 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();

多谢你们!


森林海
浏览 133回答 1
1回答

蓝山帝景

您可以为此使用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"    ]  ]}从文档:mergeRecursive 方法将给定的数组或集合递归地与原始集合合并。如果给定项中的字符串键与原始集合中的字符串键匹配,则这些键的值将合并到一个数组中,这是递归完成的:$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]
随时随地看视频慕课网APP
我要回答