
本文介绍如何在 laravel 或原生 php 中,将数组或集合中每个子项的指定字段(如 date)的值提取出来,作为该子项的新顶层键名,并保留对应值(如 rate),实现从关联结构到键值映射的转换。
在实际开发中,我们常遇到需要“以某字段值为键、其余数据为值”的场景。例如原始数据形如:
$data['ENFERMERIA'] = [
[
'date' => '2021-01-01T00:00:00.000000Z',
'rate' => 100.00,
'send' => true,
'open_date' => '2021-01-01',
'name' => 'Nursing Dept'
],
[
'date' => '2021-01-02T00:00:00.000000Z',
'rate' => 95.50,
'send' => false,
'open_date' => '2021-01-02',
'name' => 'Nursing Dept'
]
];目标是将其转换为:
[
'2021-01-01T00:00:00.000000Z' => 100.00,
'2021-01-02T00:00:00.000000Z' => 95.50
]✅ 推荐方案(适用于数组 & Collection):
-
若原始数据是普通 PHP 数组,使用 array_map() + array_column() 组合更简洁:
立即学习“PHP免费学习笔记(深入)”;
$result = array_column($data['ENFERMERIA'], 'rate', 'date'); // 输出:['2021-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 惯例。











