如何在Laravel PHP中从数组中删除嵌套层

时间:2019-06-19 15:01:11

标签: php laravel

我有一个我希望优化的过程:我有以下数组

$journeys = [
    [
        'journey_id' => '123',
        'stops' => [
            'lon' => '123123123',
            'lat' => '123123123',
            'stop_name' => 'foobar st'
         ]
         ...
    ]
    ...
]    

此数组包含1,000趟旅程,每个站点在Stops数组中大约有40-50站。

我想要做的是删除嵌套,所以最终得到这样的东西:

'stops' => [
    'journey_id' => '123',
    'lon' => '123123123',
    'lat' => '123123123',
    'stop_name' => 'foobar st'
]

目前,我唯一能做到这一点的方法是循环遍历数组中的每个项目,然后每个停靠点并创建一个新数组。

像这样:

$stops = [];

foreach($journeys as $journey){
    foreach($journey['stops'] as $stop){
        array_push($stops, [
            'journey_id' => $journey['journey_id'],
            'lon' => '123123123',
            'lat' => '123123123',
            'stop_name' => 'foobar st'
        ])
    }    

}

此过程很慢!有谁知道我可以更快地做到这一点?

我正在使用laravel,因此可以进行收集,尽管我尝试了一下,但似乎并没有更快。

2 个答案:

答案 0 :(得分:0)

您可以收集它,然后在其上进行映射,如下所示:

$stops = collect($journeys)->map(function($v, $k){
                return $v['stops'];
         }); 

如果收集不适合您,您还可以使用array_map。

答案 1 :(得分:0)

您可以通过向集合中添加$journeys并使用->map()集合方法来映射应如何返回数据来实现此目的:

$journeys = collect($journeys)->map(function ($journey, $key) {
    $journey['stops']['journey_id'] = $journey['journey_id'];
    unset($journey['journey_id']);
    return $journey;
})->all();

在这里,我们创建了一系列旅程。我们遍历每个过程,将journey_id添加到stops数组中,然后取消设置原始的journey_id

然后使用->all()返回新数组。

注意:如果使用Laravel雄辩的模型,请使用$journeys->map(...),因为它已经是一个集合实例。