陣列是 PHP 最核心、最靈活的資料結構,同時扮演列表、映射表、集合、堆疊、佇列等多種角色。本系列第一部分聚焦於陣列建立、遍歷與基礎操作,掌握這些基石,後續排序、過濾、轉換、聚合等進階操作才能得心應手。
<?php
// 索引陣列(數字鍵名 0,1,2...)
$fruits = ['Apple', 'Banana', 'Cherry'];
// 等同於
$fruits = array('Apple', 'Banana', 'Cherry');
// 關聯陣列(字串鍵名)
$user = [
'name' => 'Alice',
'age' => 25,
'city' => 'Taipei'
];
// 多維陣列
$users = [
['name' => 'Alice', 'age' => 25],
['name' => 'Bob', 'age' => 30],
];
// 短陣列語法(PHP 5.4+)已成標準,建議統一使用 []
?>
<?php
$arr = [];
$arr[] = 'first'; // 自動索引 0
$arr[] = 'second'; // 自動索引 1
$arr[10] = 'tenth'; // 指定索引 10
$arr['key'] = 'value'; // 關聯鍵名
// 結果:[0=>'first', 1=>'second', 10=>'tenth', 'key'=>'value']
// 注意:整數鍵名會影響下一個自動索引(下一個為 11)
?>
<?php
// 數字範圍
$numbers = range(1, 10); // [1,2,3,4,5,6,7,8,9,10]
$evens = range(2, 20, 2); // 步長 2:[2,4,6,8,10,12,14,16,18,20]
$reverse = range(10, 1); // 遞減:[10,9,8,7,6,5,4,3,2,1]
// 字元範圍(支援 ASCII 字元)
$letters = range('a', 'z'); // ['a','b',...,'z']
$upper = range('A', 'Z'); // 大寫字母
$hex = range('0', 'f'); // 0-9, :, ;, <, =, >, ?, @, A-F(含符號!)
// 純十六進位字元建議手動定義或過濾
?>
<?php
$data = ['name' => 'Alice', 'age' => 25, 'city' => 'Taipei'];
// 1. 鍵值對(最常用)
foreach ($data as $key => $value) {
echo "$key: $value\n";
}
// 2. 僅需值
foreach ($data as $value) {
echo "$value\n";
}
// 3. 需修改原陣列值:參考傳遞 &
foreach ($data as $key => &$value) {
if (is_string($value)) $value = strtoupper($value);
}
unset($value); // 關鍵:解除參考!
// 4. 陣列解構(PHP 7.1+)
foreach ($users as ['name' => $name, 'age' => $age]) {
echo "$name is $age years old\n";
}
?>
current(), next(), reset() 等)unset($arr[$key]) 刪除當前元素(會導致跳過),需先收集鍵名再刪除<?php
$arr = ['a', 'b', 'c'];
count($arr); // 3
count($arr, COUNT_RECURSIVE); // 遞迴計數多維陣列
is_array($arr); // true
array_is_list($arr); // PHP 8.1+ 判斷是否為列表(連續數字鍵 0...n)
// ['a','b'] => true, [1=>'a', 0=>'b'] => false, ['a'=>1] => false
?>
<?php
$a = ['a' => 1, 'b' => 2];
$b = ['c' => 3, 'b' => 20]; // 相同鍵名:後者覆蓋
array_merge($a, $b); // ['a'=>1, 'b'=>20, 'c'=>3] - 字串鍵名覆蓋,數字鍵名重新索引
$a + $b; // ['a'=>1, 'b'=>2, 'c'=>3] - 聯合運算子:鍵名不覆蓋
// 分割
$chunk = array_chunk(range(1,10), 3);
// [[1,2,3], [4,5,6], [7,8,9], [10]]
$slice = array_slice(['a','b','c','d','e'], 1, 3);
// ['b','c','d'] (從索引1開始取3個)
?>
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 1];
array_flip($arr); // [1 => 'c', 2 => 'b'] 值變鍵名,重複值後者勝出
array_keys($arr); // ['a','b','c']
array_values($arr); // [1,2,1] 重新索引
array_column($users, 'name', 'id'); // 多維陣列提取欄位建立映射
?>
<?php
$arr = ['apple', 'banana', 'cherry'];
in_array('banana', $arr, true); // true (嚴格模式)
array_search('banana', $arr, true); // 1 (回傳鍵名)
array_key_exists('b', $arr); // false (檢查鍵名)
isset($arr['b']); // false (且不檢查 null 值)
// 多值檢查
$allowed = ['admin', 'editor', 'author'];
$userRoles = ['editor', 'viewer'];
array_intersect($userRoles, $allowed); // ['editor'] 交集
array_diff($userRoles, $allowed); // ['viewer'] 差集
?>
陣列可直接作為堆疊或佇列使用:
<?php
$stack = [];
array_push($stack, 1, 2, 3); // [1,2,3]
array_pop($stack); // 3, 剩 [1,2]
$queue = [];
array_push($queue, 1, 2, 3); // 入隊
array_shift($queue); // 1 出隊,剩 [2,3]
// 更語意化的別名(PHP 7.3+)
$stack = [];
$stack[] = 1; // array_push
array_pop($stack); // array_pop
$queue = [];
$queue[] = 1; // 入隊
array_shift($queue); // 出隊
?>
<?php
$data = [1, 0, '', 'text', null, false, [], 'keep'];
$filtered = array_filter($data, fn($v) => $v !== '' && $v !== null && $v !== false);
// [1, 0, 'text', 'keep'] 注意:0 保留,若要移除所有假值用無回呼 array_filter($data)
?>
<?php
$arr = ['a', 'b', 'a', 'c', 'b'];
array_unique($arr); // ['a','b','c'] 鍵名保留:[0=>'a', 1=>'b', 3=>'c']
array_values(array_unique($arr)); // ['a','b','c'] 重新索引 [0,1,2]
?>
<?php
$users = [
['name' => 'Alice', 'dept' => 'IT'],
['name' => 'Bob', 'dept' => 'HR'],
['name' => 'Charlie', 'dept' => 'IT'],
];
$byDept = [];
foreach ($users as $user) {
$byDept[$user['dept']][] = $user;
}
// 或 PHP 5.5+ array_column + 群組邏輯
?>
<?php
$multi = [[1,2], [3,4], [5,6]];
$flat = array_merge(...$params); // PHP 7.4+ spread operator
// 或
$flat = [];
array_walk_recursive($multi, fn($v) => $flat[] = $v);
?>
| 場景 | 推薦結構 | 理由 |
|---|---|---|
| 簡單列表、配置、暫存資料 | 陣列 [] | 語法簡潔、內建函式豐富、序列化原生支援 |
| 領域模型、業務邏輯封裝 | Class / readonly class / DTO | 型別安全、IDE 支援、封裝不變條件 |
| 大量資料處理、鏈式操作、不可變 | Ds\Vector, Ds\Map, Laravel Collection | 效能優化、函式式 API、記憶體效率 |
| 固定結構、高效能、低記憶體 | SplFixedArray | C 級陣列、不可動態擴充但極快 |
陣列是 PHP 的「瑞士刀」,熟練掌握建立、遍歷、合併、分割、搜尋、堆疊/佇列操作,是寫出簡潔高效代碼的基礎。下一篇將深入探討陣列排序、過濾、映射、歸約等函數式風格操作,以及多維陣列的進階處理技巧。