前言
陣列是 PHP 最強大、最常用的資料結構,本質上是有序的映射。PHP 陣列同時支援索引陣列、關聯陣列、多維陣列,且大小動態調整。本文從定義語法、存取、遍歷、常用操作到進階技巧,建立完整知識體系。
陣列定義語法
短陣列語法 [](PHP 5.4+,推薦)
<?php
// 索引陣列(數字鍵,自動從 0 開始)
$fruits = ['apple', 'banana', 'orange'];
// 關聯陣列(字串鍵 => 值)
$user = [
'name' => 'John',
'email' => 'john@example.com',
'age' => 30,
'tags' => ['php', 'laravel', 'mysql']
];
// 混合鍵
$mixed = [
10 => 'ten',
'name' => 'John',
20 => 'twenty',
];
?>
傳統 array() 語法
<?php
$fruits = array('apple', 'banana', 'orange');
$user = array('name' => 'John', 'age' => 30);
?>
動態建立(無需預先宣告)
<?php
$arr = []; // 初始化空陣列
$arr[] = 'first'; // 自動索引 0
$arr[] = 'second'; // 自動索引 1
$arr['key'] = 'value'; // 關聯鍵
// 多維動態建構
$matrix = [];
for ($i = 0; $i < 3; $i++) {
for ($j = 0; $j < 3; $j++) {
$matrix[$i][$j] = $i * $j;
}
}
?>
陣列存取與修改
<?php
$user = ['name' => 'John', 'age' => 30, 'skills' => ['PHP', 'JS']];
// 讀取
echo $user['name']; // John
echo $user['skills'][0]; // PHP
// 修改
$user['age'] = 31;
$user['skills'][1] = 'TypeScript';
// 新增
$user['city'] = 'Taipei';
$user['skills'][] = 'Python';
// 判斷鍵是否存在
isset($user['name']); // true(快,但值為 null 回 false)
array_key_exists('name', $user); // true(含 null 值)
?>
陣列遍歷(迭代)
foreach(最常用、最安全)
<?php
$colors = ['red', 'green', 'blue'];
// 僅需值
foreach ($colors as $color) {
echo $color . "\n";
}
// 需要鍵與值
$user = ['name' => 'John', 'age' => 30];
foreach ($user as $key => $value) {
echo "$key: $value\n";
}
// 參考修改原陣列值
foreach ($colors as &$color) {
$color = strtoupper($color);
}
unset($color); // 重要:解除參考
print_r($colors); // ['RED', 'GREEN', 'BLUE']
?>
for 迴圈(適用索引陣列、需控制索引)
<?php
$arr = ['a', 'b', 'c'];
for ($i = 0, $len = count($arr); $i < $len; $i++) {
echo "$i: {$arr[$i]}\n";
}
?>
while + each() / list()(舊式,不推薦新代碼)
<?php
$arr = ['a', 'b', 'c'];
reset($arr); // 重置指標
while (list($key, $val) = each($arr)) {
echo "$key => $val\n";
}
// PHP 7.2+ each() 棄用,8.0+ 移除
?>
多維陣列遞迴遍歷
<?php
function printArrayRecursive(array $arr, int $depth = 0): void {
$indent = str_repeat(' ', $depth);
foreach ($arr as $key => $value) {
if (is_array($value)) {
echo "$indent[$key] => Array\n";
printArrayRecursive($value, $depth + 1);
} else {
echo "$indent[$key] => $value\n";
}
}
}
$data = [
'user' => ['name' => 'John', 'tags' => ['php', 'go']],
'settings' => ['theme' => 'dark', 'lang' => 'zh_TW']
];
printArrayRecursive($data);
?>
常用陣列操作函數分類速查
增刪改查
| 操作 | 函數/語法 | 備註 |
| 尾端推入 | array_push($arr, $v) / $arr[] = $v | $arr[] 效能更好 |
| 尾端彈出 | array_pop($arr) | 返回彈出值 |
| 頭端推入 | array_unshift($arr, $v) | 索引重新排序 |
| 頭端彈出 | array_shift($arr) | 索引重新排序 |
| 指定位置插入/刪除/替換 | array_splice($arr, $offset, $len, $new) | 功能最強大 |
| 刪除指定鍵 | unset($arr[$key]) | 不重新索引 |
| 合併(字串鍵後者覆蓋,數字鍵重新索引) | array_merge($a, $b) | |
| 合併(先出現優先,鍵保留) | $a + $b | |
搜尋與篩選
| 操作 | 函數 | 範例 |
| 值搜尋(回傳鍵) | array_search($val, $arr, true) | 第三參數 true 嚴格比較 |
| 鍵存在檢查 | array_key_exists($key, $arr) | |
| 值存在檢查 | in_array($val, $arr, true) | 嚴格模式建議開啟 |
| 篩選 | array_filter($arr, fn($v) => $v > 10) | 保留鍵,可用 array_values() 重新索引 |
| 映射轉換 | array_map(fn($v) => $v*2, $arr) | |
| 歸約 | array_reduce($arr, fn($c, $v) => $c+$v, 0) | 求和、累積 |
排序
| 函數 | 說明 | 鍵名保留 |
sort() | 值由小到大 | ❌ 重新索引 |
rsort() | 值由大到小 | ❌ |
asort() | 值由小到大 | ✅ 保留鍵值關聯 |
arsort() | 值由大到小 | ✅ |
ksort() | 鍵由小到大 | ✅ |
krsort() | 鍵由大到小 | ✅ |
usort() | 自訂比較函數排序值 | ❌ |
uasort() | 自訂比較函數排序值 | ✅ |
uksort() | 自訂比較函數排序鍵 | ✅ |
實用技巧
陣列去重
<?php
$arr = [1, 2, 2, 3, 3, 3];
$unique = array_unique($arr); // [1, 2, 3] 保留第一次出現的鍵
$reindexed = array_values($unique); // [1, 2, 3] 重新索引 0,1,2
?>
陣列欄位提取
<?php
$users = [
['id'=>1, 'name'=>'A', 'age'=>20],
['id'=>2, 'name'=>'B', 'age'=>25],
];
$names = array_column($users, 'name'); // ['A', 'B']
$ids = array_column($users, 'id', 'name'); // ['A'=>1, 'B'=>2] 第三參數作鍵
?>
陣列分塊
<?php
$items = range(1, 10);
$chunks = array_chunk($items, 3);
// [[1,2,3], [4,5,6], [7,8,9], [10]]
?>
結語
PHP 陣列融合了列表、映射、集合、堆疊、佇列等多種資料結構特性,靈活強大。掌握 [] 短語法、foreach 參考遍歷、array_map/filter/reduce 函數式風格、排序函數的鍵名保留差異,能讓資料處理代碼更簡潔、高效、易讀。記住:動態建構多維陣列時先初始化子陣列,合併陣列明確選擇 + 或 array_merge。