PHP 陣列是有序映射,同時支援索引陣列(數字鍵)與關聯陣列(字串鍵),並可巢狀形成多維陣列。掌握宣告方式、操作函數、內部實作特性,能寫出高效率程式碼。
| 類型 | 鍵名 | 特性 | 範例 |
|---|---|---|---|
| 索引陣列 | 連續整數 0,1,2... | 有序、可疊代、記憶體連續 | ['a','b','c'] |
| 關聯陣列 | 字串 | 雜湊表查找 O(1)、無序(PHP 7+ 保持插入序) | ['name'=>'John', 'age'=>25] |
| 混合陣列 | 整數+字串 | 兩者共存,鍵名不衝突 | [0=>'a', 'key'=>'b'] |
| 多維陣列 | 陣列值為陣列 | 樹狀結構、任意深度 | [['a','b'], ['c'=>'d']] |
<?php
// 索引陣列
$fruits = ['apple', 'banana', 'orange'];
// 關聯陣列
$user = ['name' => 'John', 'age' => 30, 'active' => true];
// 多維陣列
$matrix = [
[1, 2, 3],
[4, 5, 6],
];
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
];
$arr = array('a', 'b', 'c');
$assoc = array('key' => 'value', 'foo' => 'bar');
$arr[] = 'first'; // 鍵 0
$arr[] = 'second'; // 鍵 1
$arr[10] = 'tenth'; // 鍵 10,下一個 [] 會是 11
$arr['custom'] = 'value'; // 字串鍵
$lines = file('data.txt', FILE_IGNORE_NEW_LINES); // 檔案每行一元素
$fields = explode(',', 'a,b,c'); // 字串分割
$obj = (array) $object; // 物件轉陣列(屬性變鍵名)
$json = json_decode($jsonStr, true); // JSON 轉關聯陣列
| 分類 | 函數 | 用途 |
|---|---|---|
| 新增/移除 | array_push / [] | 推入尾部 |
| array_unshift | 推入頭部 | |
| array_pop | 彈出尾部 | |
| array_shift | 彈出頭部 | |
| 查找/篩選 | in_array | 值是否存在 |
| array_search | 找值回傳鍵 | |
| array_filter | 回調過濾 | |
| array_column | 提取欄位 | |
| 轉換/重組 | array_map | 逐元素映射 |
| array_reduce | 歸約累積 | |
| array_merge | 合併陣列 | |
| array_combine | 鍵值陣列合併 | |
| 排序 | sort / rsort | 值排序(重設鍵) |
| asort / arsort | 值排序(保持鍵) | |
| ksort / krsort | 鍵排序 |
<?php
$users = [
['id' => 1, 'name' => 'Alice', 'scores' => [80, 90, 85]],
['id' => 2, 'name' => 'Bob', 'scores' => [70, 75, 80]],
];
// 提取所有名字
$names = array_column($users, 'name'); // ['Alice', 'Bob']
// 依分數平均排序
usort($users, function($a, $b) {
$avgA = array_sum($a['scores']) / count($a['scores']);
$avgB = array_sum($b['scores']) / count($b['scores']);
return $avgB <=> $avgA; // 降冪
});
// 扁平化分數
$allScores = array_merge(...array_column($users, 'scores')); // [80,90,85,70,75,80]
// 搜尋 id=2 的使用者
$user = array_filter($users, fn($u) => $u['id'] === 2);
$user = array_values($user)[0] ?? null; // 重設索引取第一筆
array_push,預先配置大小或用 Generator 惰性產生。in_array 大陣列效能差(O(n)),頻繁查找請改用 isset($arr[$key])(O(1))或翻轉鍵值 array_flip。array_merge 會重設數字鍵,保留字串鍵(後者覆蓋前者),合併索引陣列用 + 運算子或 array_merge_recursive。&$value 修改原陣列值,foreach ($arr as &$v) 迴圈結束後建議 unset($v) 避免殘留參考。<?php
$fixed = new SplFixedArray(1000000); // 預先配置 100 萬元素,記憶體較陣列省 ~50%
$fixed[0] = 'first';
$fixed[999999] = 'last';
// 不支援字串鍵、動態擴展,但極大幅度降低記憶體
PHP 陣列功能強大且靈活,善用內建函數、理解內部實作(HashTable + 雙向鏈表),能在開發效率與執行效能間取得最佳平衡。