陣列是 PHP 最核心、最靈活的資料結構,同時扮演有序映射(Hash Table)與列表雙重角色。熟練掌握陣列建立、遍歷、操作函數與效能特性,是寫出高效 PHP 代碼的關鍵。
$arr = [1, 2, 3, 4, 5]; // 短語法 PHP 5.4+
$arr = array(1, 2, 3, 4, 5); // 傳統語法
// 索引:0,1,2,3,4
$arr = [
'name' => '張三',
'age' => 25,
'city' => '台北'
];
// 索引:'name', 'age', 'city'
$arr = [10, 'name' => '李四', 20];
// 索引:0, 'name', 1
$matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
$users = [
['id' => 1, 'name' => 'A'],
['id' => 2, 'name' => 'B']
];
| 函數 | 特點 | 適用場景 |
|---|---|---|
print_r() | 易讀格式,不顯示型別 | 快速除錯 |
var_dump() | 顯示型別、長度、參考 | 深度除錯 |
var_export() | 輸出合法 PHP 代碼 | 快取導出、配置檔生成 |
json_encode() | JSON 格式,前端互通 | API 回傳、日誌記錄 |
// 僅值
foreach ($arr as $value) { ... }
// 鍵值
foreach ($arr as $key => $value) { ... }
// 修改原陣列值(引用)
foreach ($arr as &$value) {
$value *= 2;
}
unset($value); // 重要:解除引用,避免後續汙染
for ($i = 0, $len = count($arr); $i < $len; $i++) {
echo $arr[$i];
}
while (list($key, $value) = each($arr)) { ... }
// PHP 7.2+ 棄用 each()
reset($arr); // 指標指首
next($arr); // 下一個
prev($arr); // 上一個
end($arr); // 指尾
key($arr); // 當前鍵
current($arr); // 當前值
// 新增
$arr[] = 'new'; // 追加數值索引
$arr['key'] = 'value'; // 指定鍵名
array_push($arr, 'a', 'b'); // 批次追加
array_unshift($arr, 'first'); // 開頭插入
// 刪除
unset($arr['key']); // 指定鍵(不重排索引)
array_shift($arr); // 移除首元素(重排數值索引)
array_pop($arr); // 移除尾元素
array_splice($arr, 1, 2); // 位置 1 刪除 2 個
// 修改
$arr['key'] = 'newval';
| 函數 | 排序依據 | 鍵名保留 | 順序 |
|---|---|---|---|
sort() | 值 | ❌ 重排 0..n | 升序 |
rsort() | 值 | ❌ | 降序 |
asort() | 值 | ✅ | 升序 |
arsort() | 值 | ✅ | 降序 |
ksort() | 鍵 | ✅ | 升序 |
krsort() | 鍵 | ✅ | 降序 |
usort() | 自訂比較 | ❌ | 自訂 |
uasort() | 自訂比較 | ✅ | 自訂 |
uksort() | 自訂比較鍵 | ✅ | 自訂 |
自然排序:natsort()、natcasesort()(人類直覺:img2 < img10)
in_array($needle, $arr, true); // 嚴格模式建議 true
array_search($needle, $arr, true); // 回傳鍵名,找不到 false
array_key_exists('key', $arr); // 檢查鍵存在(含 null 值)
isset($arr['key']); // 鍵存在且非 null(較快)
isset($arr['a']['b']['c']); // 多層安全檢查
count($arr); // 元素個數(遞迴模式 COUNT_RECURSIVE)
sizeof($arr); // count 別名
array_sum($arr); // 數值加總
array_product($arr); // 數值乘積
array_count_values($arr); // 值出現次數統計
array_merge($a, $b); // 合併(數值鍵重排,字串鍵後覆蓋前)
$a + $b; // 聯集(字串鍵優先保留 $a)
array_combine($keys, $values); // 兩陣列組成關聯陣列
array_slice($arr, 0, 3); // 切片(保留鍵名需第 4 參數 true)
array_chunk($arr, 2); // 分塊
array_intersect($a, $b); // 交集(比較值)
array_diff($a, $b); // 差集($a 有 $b 無)
extract($arr); // 陣列鍵變變數(需慎用,建議 EXTR_PREFIX_ALL)
compact('a', 'b', 'c'); // 變數組成陣列
list($a, $b) = $arr; // 解包賦值(PHP 7.1+ 支援鍵名)
foreach ($users as &$user) {
$user['name'] = strtoupper($user['name']);
}
unset($user);
usort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 或
array_multisort(array_column($users, 'age'), SORT_ASC, $users);
$names = array_column($users, 'name'); // ['A', 'B']
$map = array_column($users, 'name', 'id'); // [1 => 'A', 2 => 'B']
// 慢
for ($i = 0; $i < count($arr); $i++) { ... }
// 快
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }
function largeDataGenerator() {
for ($i = 0; $i < 1000000; $i++) {
yield $i => $i * 2;
}
}
foreach (largeDataGenerator() as $k => $v) { ... }
// 記憶體 O(1) 而非 O(n)
function process(&$bigArray) { ... } // 傳參考
process($hugeArray);
unset($hugeArray);
// 或
$hugeArray = null;
// 觸發 GC 回收(PHP 7+ 即時釋放)
| 陷阱 | 說明 | 正確做法 |
|---|---|---|
| foreach 引用殘留 | 迴圈後 $value 仍為引用 | 迴圈後 unset($value) |
| in_array 嚴格模式 | 預設鬆散比較 '1' == 1 | 第三參數 true |
| array_merge 數值鍵重排 | 0,1,2 重新索引 | 用 + 運算子保留鍵 |
| isset vs array_key_exists | isset 對 null 回傳 false | 需區分「無鍵」與「值為 null」用 array_key_exists |
| 陣列鍵型別轉換 | '1' (string) == 1 (int) | 刻意使用字串鍵避免隱性轉型 |
使物件可像陣列操作:
class Collection implements ArrayAccess, Iterator, Countable {
private $data = [];
// 實作 offsetGet/Set/Exists/Unset
// 實作 current/key/next/rewind/valid
// 實作 count()
}
$c = new Collection();
$c['key'] = 'value';
foreach ($c as $k => $v) { ... }
echo count($c);
PHP 陣列功能極其豐富,核心建議:
[] 短語法與 foreacha/k/ua/uk 系列)yield 生成器避免記憶體爆炸true 參數array_column、array_multisort 處理多維資料