Laravel中PHP嵌套数组合并:重命名timestamp为start/end
合并Laravel中重复
device字段的PHP数组 我在Laravel框架中处理PHP数组,现有如下嵌套数组,其中存在device字段重复的项,原数组包含device、timestamp、value三个字段:
$consumos = array( array( "device" => "EA1", "timestamp" => "2020-01-01 21:00:00", "value" => 4, ), array( "device" => "EA1", "timestamp" => "2020-01-01 07:00:00", "value" => 4, ), array( "device" => "EA2", "timestamp" => "2022-01-01 12:00:00", "value" => 2, ), array( "device" => "EA2", "timestamp" => "2022-01-01 13:00:00", "value" => 2, ), );
需要将其转换为如下结构:把相同device的项合并,原timestamp字段分别重命名为start和end,每个device对应一条数组项:
array( "device" => "EA1", "start" => "2020-01-01 21:00:00", "end" => "2020-01-01 07:00:00", "value" => 4, ), array( "device" => "EA2", "start" => "2022-01-01 12:00:00", "end" => "2022-01-01 13:00:00", "value" => 2, ),
实现方法
方法一:使用Laravel集合(推荐,符合Laravel开发习惯)
利用Laravel集合的分组、映射能力快速处理:
$result = collect($consumos) ->groupBy('device') ->map(function ($items, $device) { // 提取当前device的value(假设同一device的value一致) $value = $items->first()['value']; // 提取所有timestamp,按原顺序赋值给start和end $timestamps = $items->pluck('timestamp')->toArray(); return [ 'device' => $device, 'start' => $timestamps[0], 'end' => $timestamps[1], 'value' => $value, ]; }) ->values() // 重置数组索引,去掉device作为键名的结构 ->toArray();
如果需要兼容同一device有多条数据的场景,取最早和最晚时间作为start和end,可以修改时间提取逻辑:
$result = collect($consumos) ->groupBy('device') ->map(function ($items, $device) { $value = $items->first()['value']; // 取最早时间为start,最晚时间为end $start = $items->min('timestamp'); $end = $items->max('timestamp'); return [ 'device' => $device, 'start' => $start, 'end' => $end, 'value' => $value, ]; }) ->values() ->toArray();
方法二:原生PHP循环实现
如果不想依赖Laravel集合,用原生PHP循环也能实现:
$result = []; $tempGroup = []; // 先按device分组存储数据 foreach ($consumos as $item) { $device = $item['device']; if (!isset($tempGroup[$device])) { $tempGroup[$device] = [ 'device' => $device, 'timestamps' => [], 'value' => $item['value'] ]; } $tempGroup[$device]['timestamps'][] = $item['timestamp']; } // 转换为目标结构 foreach ($tempGroup as $group) { $result[] = [ 'device' => $group['device'], 'start' => $group['timestamps'][0], 'end' => $group['timestamps'][1], 'value' => $group['value'] ]; }
内容的提问来源于stack exchange,提问作者Pedro Barata Fernandes
相关产品推荐
相关产品推荐

