You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:48:19