在 PHP 開發中,經常需要從資料庫查詢結果(典型的二維陣列)中提取某個欄位的所有值,組成一個一維陣列。例如將用戶列表中的所有 id 或 name 獨立出來。雖然用 foreach 迴圈配合 array_push 也能完成,但效率較低。本文介紹三種原生函數方案,並分析其效能差異。
$users = [
['id' => 1, 'name' => '張三', 'email' => 'zhangsan@sina.com'],
['id' => 2, 'name' => '李四', 'email' => 'lisi@163.com'],
['id' => 5, 'name' => '王五', 'email' => '10000@qq.com'],
// ... 更多記錄
];
$ids = array_map('array_shift', $users);
此法利用 array_shift 取出每個子陣列的第一個值。但它假設 id 永遠是第一個元素,且會修改原陣列,實際專案中極不穩健。
$ids = array_column($users, 'id');
array_column 專為此場景設計,語意清晰、效能最高,且不改變原陣列。只要 PHP 版本 ≥ 5.5,請優先使用。
若需要 [1 => '張三', 2 => '李四', 5 => '王五'] 這樣的關聯陣列,可用 array_reduce:
$nameMap = array_reduce($users, function($carry, $item) {
$carry[$item['id']] = $item['name'];
return $carry;
}, []);
註:舊寫法常用 create_function,已棄用,請改用匿名函數。
實務上,只要版本允許,永遠優先用 array_column;需建立映射表時,array_reduce 是乾淨的函數式寫法。