Laravel/PHP 中将数组或集合的某个字段值设为新键名的实用技巧

本文介绍如何在 laravel 或原生 php 中,将数组或集合中每个子项的指定字段(如 date)的值提取出来,作为该子项的新顶层键名,并保留对应值(如 rate),实现从关联结构到键值映射的转换。

在实际开发中,我们常遇到需要“以某字段值为键、其余数据为值”的场景。例如原始数据形如:

$data['ENFERMERIA'] = [
    [
        'date' => '2025-01-01T00:00:00.000000Z',
        'rate' => 100.00,
        'send' => true,
        'open_date' => '2025-01-01',
        'name' => 'Nursing Dept'
    ],
    [
        'date' => '2025-01-02T00:00:00.000000Z',
        'rate' => 95.50,
        'send' => false,
        'open_date' => '2025-01-02',
        'name' => 'Nursing Dept'
    ]
];

目标是将其转换为:

[
    '2025-01-01T00:00:00.000000Z' => 100.00,
    '2025-01-02T00:00:00.000000Z' => 95.50
]

推荐方案(适用于数组 & Collection)

  • 若原始数据是普通 PHP 数组,使用 array_map() + array_column() 组合更简洁:

    $result = array_column($data['ENFERMERIA'], 'rate', 'date');
    // 输出:['2025-01-01T00:00:00.000000Z' => 100.00, ...]
  • 若使用 Laravel Collection,链式调用更优雅:

    $collection = collect($data['ENFERMERIA']);
    $result = $collection->pluck('rate', 'date')->all();
    // 同样返回键值映射数组

⚠️ 注意事项

  • array_column($array, $valueKey, $keyKey) 要求 PHP ≥ 7.0;pluck('value', 'key') 是 Laravel 5.2+ 的标准方法。
  • 若 date 字段不唯一,后出现的项会覆盖前面同键的值(PHP 关联数组键唯一性限制)。
  • 如需保留完整子项(而非仅 rate),可改用 mapWithKeys():
    $result = collect($data['ENFERMERIA'])
        ->mapWithKeys(fn($item) => [$item['date'] => $item])
        ->all();

? 小结:优先使用 array_column()(数组)或 pluck()(Collection)实现高效键值重映射;避免手动遍历拼接,既简洁又符合 Laravel 惯例。