陣列是 PHP 中最核心、最靈活的資料結構。本筆記系列將系統梳理陣列的定義、分類、初始化、賦值、存取等基礎知識,適合初學者建立正確概念,也適合老手快速複習。
陣列是一組有序的鍵值對集合。每個元素由鍵與值組成:
foreach 遍歷順序即插入順序。這與 C/Java 的「固定大小、同型別、連續記憶體」陣列截然不同,PHP 陣列實為有序哈希表。
// 短陣列語法 (PHP 5.4+,推薦) $arr = []; // 經典語法 $arr = array(); // 宣告並初始化 $arr = [1, 2, 3]; // 索引陣列 $arr = ['a' => 1, 'b' => 2]; // 關聯陣列
分類依據在於鍵的型別:
| 類型 | 鍵名特徵 | 範例 |
|---|---|---|
| 索引陣列 | 全為整數,且自動從 0 開始連續遞增 | [10, 20, 30] → 鍵為 0,1,2 |
| 關聯陣列 | 包含至少一個字串鍵 | ['name' => 'Tom', 'age' => 18] |
| 混合陣列 | 同時包含整數與字串鍵 | [10, 'name' => 'Tom'] |
注意:PHP 內部不區分兩者,array 型別統一。但行為上有差異:
array_push()、array_pop()、array_shift()、array_unshift() 只操作整數鍵(重新索引)。foreach 遍歷順序永遠是插入順序,與鍵型別無關。// 三種等價寫法 $arr[0] = 1; // 直接指定索引賦值 $arr = ['0' => 1]; // 明確指定字串鍵 '0'(會被轉為整數 0) $arr = [1]; // 短語法,自動分配索引 0 // 讀取 echo $arr[0]; // 1
$user = [
'name' => '張三',
'age' => 25,
'city' => '北京'
];
// 讀取
echo $user['name']; // 張三
// 新增/修改
$user['email'] = 'zhangsan@example.com';
$user['age'] = 26;
// 刪除
unset($user['city']);
// 判斷鍵是否存在
isset($user['name']); // true(值非 null)
array_key_exists('age', $user); // true(即使值為 null)
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// 只取值
foreach ($arr as $value) {
echo $value . ' ';
}
// 取鍵與值(推薦)
foreach ($arr as $key => $value) {
echo "$key => $value\n";
}
// 參考傳遞修改原陣列值
foreach ($arr as &$value) {
$value *= 2;
}
unset($value); // 重要:解除參考,避免後續誤用
print_r($arr); // a=>2, b=>4, c=>6
array_merge()、array_push()、array_unshift() 會將整數鍵重新從 0 排序,字串鍵保持不變(後者覆蓋前者)。$arr['0'] 等同於 $arr[0],$arr['01'] 保持字串 '01'。unset($value),否則後續迴圈可能污染最後一個元素(詳見「PHP foreach 參考陷阱」筆記)。$b = $a 複製鍵值對,若值為物件/資源/陣列,則共享同一實體。深拷貝需用 serialize/unserialize 或遞迴複製。// 練習 1:建立一個包含 5 個城市名稱的索引陣列,輸出第 3 個
$cities = ['台北', '台中', '高雄', '台南', '新竹'];
echo $cities[2]; // 高雄
// 練習 2:建立一個學生關聯陣列,包含姓名、學號、科系,修改科系並新增電話
$student = ['name' => '李四', 'id' => 'S12345', 'dept' => '資工系'];
$student['dept'] = '電機系';
$student['phone'] = '0912-345678';
// 練習 3:遍歷練習 2 的陣列,格式化輸出 "鍵: 值"
foreach ($student as $k => $v) {
echo "$k: $v\n";
}
下一篇筆記將深入陣列進階操作:多維陣列、陣列函式大全、排序與過濾、SPL 陣列物件等。請動手實作上述練習,建立肌肉記憶。