PHP 是弱型別語言,陣列同時支援數字索引與關聯鍵值。關聯陣列(Associative Array)以字串為鍵,是處理結構化資料的核心工具。本文系統整理關聯陣列的常見操作。
直接指定鍵名賦值即可:
$arr = [];
$arr['name'] = '張三';
$arr['email'] = 'zhang@example.com';
// 或一次宣告
$arr = ['name' => '李四', 'age' => 25];
注意: array_push()、array_unshift() 僅適用數字索引陣列,關聯陣列請直接賦值。
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
unset($arr['b']); // 刪除指定鍵
// 陣列鍵名保持不變,不會重新索引
數字索引陣列可用 array_shift()(刪首)、array_pop()(刪尾),關聯陣列不適用。
$states = ['Taipei' => '台北', 'Taichung' => '台中'];
$flipped = array_flip($states);
// 結果:['台北' => 'Taipei', '台中' => 'Taichung']
若原陣列值有重複,後者會覆蓋前者。
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['c' => 3, 'b' => 20]; // 鍵 'b' 重複
$merged = array_merge($arr1, $arr2);
// 結果:['a' => 1, 'b' => 20, 'c' => 3] 後者覆蓋前者
// 若為數字索引,會重新索引從 0 開始
$data = ['name' => 'john doe', 'city' => 'taipei'];
$formatted = array_map('ucwords', $data);
// 結果:['name' => 'John Doe', 'city' => 'Taipei']
也可使用匿名函數處理複雜邏輯:
$clean = array_map(function($v) {
return htmlspecialchars(trim($v));
}, $input);
$arr = ['z' => 1, 'a' => 2, 'm' => 3];
ksort($arr); // 依鍵名升冪排序,保持鍵值關聯
// 結果:['a' => 2, 'm' => 3, 'z' => 1]
// 相關:krsort() 降冪、uksort() 使用者自訂比較
$arr = ['a', 'b', 'c', 'd', 'e'];
shuffle($arr); // 原地打亂順序
$randomKey = array_rand($arr, 2); // 取 2 個隨機鍵名
$randomVal = $arr[$randomKey[0]];
$arr = ['id' => 100, 'status' => 'active'];
isset($arr['id']); // true,檢查鍵存在且非 null
array_key_exists('id', $arr); // true,檢查鍵存在(含 null 值)
in_array('active', $arr); // true,檢查值存在
$arr = ['apple' => '蘋果', 'banana' => '香蕉'];
$key = array_search('香蕉', $arr); // 回傳 'banana'
$key = array_search('橘子', $arr); // 回傳 false
SPL 提供物件導向的陣列操作介面:
ArrayObject:陣列物件化,支援迭代、計數、序列化。ArrayIterator、RecursiveArrayIterator:遍歷多維陣列。FilterIterator:過濾元素。$obj = new ArrayObject(['x' => 1, 'y' => 2]);
$obj->append(3); // 新增數字索引元素
foreach ($obj as $k => $v) { /* ... */ }
| 操作 | 函數/語法 | 備註 |
|---|---|---|
| 新增/修改 | $arr['key'] = $val | 最通用方式 |
| 刪除 | unset($arr['key']) | 不重新索引 |
| 交換鍵值 | array_flip() | 值重複會覆蓋 |
| 合併 | array_merge() | 字串鍵:後覆蓋前;數字鍵:重新索引 |
| 映射轉換 | array_map() | 不改變原陣列 |
| 鍵名排序 | ksort()/krsort() | 原地排序 |
| 隨機打亂 | shuffle() | 原地打亂,鍵名重新索引 |
| 檢查鍵存在 | isset() / array_key_exists() | isset 忽略 null 值 |
| 檢查值存在 | in_array() | 大型陣列效能較差 |
| 搜尋值對應鍵 | array_search() | 找到第一個即返回 |