为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
森林海 2023-04-21 09:56:05
我快要疯了。鉴于我有 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();多谢你们!
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您可以为此使用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]


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信