陣列建立與初始化
基本建立方式
<?php
// 短陣列語法 (PHP 5.4+)
$numbers = [1, 3, 5, 7, 9];
$colors = ['red', 'blue', 'green'];
// 指定鍵值
$language = [
1 => 'English',
3 => 'Chinese',
5 => 'French',
];
// 多維陣列
$matrix = [
'color' => ['red', 'blue'],
'week' => ['Monday', 'Friday'],
];
?>
函式建立陣列
<?php
// range():建立範圍陣列
$nums = range(1, 10); // [1,2,3,4,5,6,7,8,9,10]
$step = range(0, 100, 10); // [0,10,20,...,100]
$letters = range('A', 'Z'); // ['A','B',...,'Z']
$reverse = range('z', 'a'); // ['z','y',...,'a']
// array_fill():填充固定值
$filled = array_fill(0, 5, 'default'); // [0=>'default', 1=>'default', ...]
$keys = ['a', 'b', 'c'];
$filledKeys = array_fill_keys($keys, 'value'); // ['a'=>'value', 'b'=>'value', 'c'=>'value']
// array_combine():合併鍵值陣列
$keys = ['id', 'name', 'email'];
$values = [1, 'John', 'john@example.com'];
$user = array_combine($keys, $values);
// ['id'=>1, 'name'=>'John', 'email'=>'john@example.com']
// compact():變數轉陣列
$name = 'John';
$age = 25;
$arr = compact('name', 'age'); // ['name'=>'John', 'age'=>25]
?>
陣列遍歷方式
| 方式 | 適用場景 | 特點 |
| foreach | 陣列/物件遍歷首選 | 語法簡潔、支援參考修改、自動重置指標 |
| for + count | 需索引控制、反向遍歷 | 效能略低、程式碼較冗長 |
| while + each/list | 舊版相容、特殊指標控制 | 已棄用 (PHP 7.2+ each 棄用) |
| array_walk | 對每個元素執行回呼 | 可傳遞額外參數、修改原陣列 |
| array_map | 轉換陣列產生新陣列 | 不修改原陣列、可多陣列並行處理 |
<?php
$data = ['apple', 'banana', 'cherry'];
// foreach 經典用法
foreach ($data as $key => $value) {
echo "$key: $value\n";
}
// array_map:轉換大寫
$upper = array_map('strtoupper', $data);
// ['APPLE', 'BANANA', 'CHERRY']
// array_walk:修改原陣列 (加前綴)
array_walk($data, function(&$item, $key) {
$item = "fruit_$item";
});
// ['fruit_apple', 'fruit_banana', 'fruit_cherry']
// 多陣列並行 map
$prices = [10, 20, 15];
$withTax = array_map(function($item, $price) {
return "$item: \${$price}";
}, $data, $prices);
?>
陣列增刪改查 (CRUD)
新增元素
<?php
$arr = [1, 2, 3];
// 尾部追加
$arr[] = 4; // [1,2,3,4]
array_push($arr, 5, 6); // [1,2,3,4,5,6] (可批次)
// 頭部插入
array_unshift($arr, 0); // [0,1,2,3,4,5,6] (鍵值重新索引)
// 指定位置插入 (array_splice)
array_splice($arr, 3, 0, 99); // [0,1,2,99,3,4,5,6]
?>
刪除元素
<?php
$arr = ['a', 'b', 'c', 'd', 'e'];
// 依值刪除 (首個符合)
unset($arr[2]); // 刪除索引 2 ('c'),鍵值保留空洞
// ['a', 'b', 3=>'d', 4=>'e']
// 依條件刪除
$arr = array_filter($arr, function($v) { return $v !== 'b'; });
// 重新索引:array_values($arr)
// 彈出尾部
$last = array_pop($arr); // 移除並回傳最後元素
// 彈出頭部
$first = array_shift($arr); // 移除並回傳第一元素,鍵值重新索引
// 區間刪除/替換
array_splice($arr, 1, 2); // 從索引 1 刪除 2 個元素
array_splice($arr, 1, 1, 'X'); // 替換索引 1 為 'X'
?>
修改與查找
<?php
$arr = ['red', 'blue', 'green', 'blue'];
// 檢查值是否存在
in_array('blue', $arr); // true
in_array('blue', $arr, true); // 嚴格模式 (型別也要符合)
// 搜尋鍵值
array_search('blue', $arr); // 1 (第一個符合的鍵)
array_keys($arr, 'blue'); // [1, 3] (所有符合的鍵)
// 鍵值互換
$flipped = array_flip($arr); // ['red'=>0, 'blue'=>3, 'green'=>2] (重複值後者覆蓋)
// 取得所有鍵/值
array_keys($arr); // [0,1,2,3]
array_values($arr); // ['red','blue','green','blue']
// 移除重複值
$unique = array_unique($arr); // ['red', 'blue', 'green'] (保留第一個鍵)
$unique = array_values($unique); // 重新索引 [0,1,2]
?>
陣列排序大全
| 函式 | 排序依據 | 鍵值保留 | 順序 |
| sort() | 值 | ❌ 重新索引 | 升冪 |
| rsort() | 值 | ❌ | 降冪 |
| asort() | 值 | ✅ | 升冪 |
| arsort() | 值 | ✅ | 降冪 |
| ksort() | 鍵 | ✅ | 升冪 |
| krsort() | 鍵 | ✅ | 降冪 |
| natsort() | 值 (自然排序) | ✅ | 升冪 |
| natcasesort() | 值 (自然排序、忽略大小寫) | ✅ | 升冪 |
| usort() | 自訂比較函式 | ❌ | 自訂 |
| uasort() | 自訂比較函式 | ✅ | 自訂 |
| uksort() | 自訂鍵比較函式 | ✅ | 自訂 |
<?php
// 自然排序:人類直覺順序
$files = ['file1.txt', 'file10.txt', 'file2.txt'];
sort($files); // ['file1.txt', 'file10.txt', 'file2.txt'] (ASCII)
natsort($files); // ['file1.txt', 'file2.txt', 'file10.txt'] (自然)
// 自訂排序:依年齡降冪
$users = [
['name'=>'A', 'age'=>25],
['name'=>'B', 'age'=>30],
['name'=>'C', 'age'=>20],
];
usort($users, function($a, $b) {
return $b['age'] <=> $a['age']; // 太空船運算子 PHP 7+
});
?>
進階陣列操作
陣列合併與差集/交集
<?php
$a = ['a', 'b', 'c'];
$b = ['c', 'd', 'e'];
// 合併 (數字鍵重新索引,字串鍵後者覆蓋)
$merged = array_merge($a, $b); // ['a','b','c','c','d','e']
// 遞迴合併 (相同字串鍵合併為陣列)
$recursive = array_merge_recursive(['x'=>1], ['x'=>2]); // ['x'=>[1,2]]
// 交集
array_intersect($a, $b); // ['c'] (值交集)
array_intersect_assoc($a, $b); // [] (鍵值都相同)
// 差集
array_diff($a, $b); // ['a','b'] (在 a 不在 b)
array_diff_assoc($a, $b); // 鍵值都不同
?>
陣列切片與分塊
<?php
$arr = range(1, 20);
// 切片:從索引 5 取 3 個
$slice = array_slice($arr, 5, 3); // [6,7,8]
// 切片並移除 (splice 修改原陣列)
$removed = array_splice($arr, 5, 3); // $arr 剩餘元素,$removed=[6,7,8]
// 分塊:每 5 個一組
$chunks = array_chunk($arr, 5); // [[1..5], [6..10], [11..15], [16..20]]
$chunksKeys = array_chunk($arr, 5, true); // 保留原鍵值
?>
實用工具函式
<?php
$arr = [3, 1, 4, 1, 5, 9, 2, 6];
// 隨機打亂
shuffle($arr);
// 隨機取鍵
$randKey = array_rand($arr); // 1 個鍵
$randKeys = array_rand($arr, 3); // 3 個鍵 (陣列)
// 陣列求和
$sum = array_sum($arr); // 31
// 統計值出現次數
$freq = array_count_values($arr); // [3=>1, 1=>2, 4=>1, 5=>1, 9=>1, 2=>1, 6=>1]
// 反轉陣列
$rev = array_reverse($arr); // 不修改原陣列
array_reverse($arr, true); // 保留鍵值
// 陣列欄位提取 (多維陣列)
$users = [
['id'=>1, 'name'=>'A', 'age'=>20],
['id'=>2, 'name'=>'B', 'age'=>25],
];
$names = array_column($users, 'name'); // ['A', 'B']
$namesById = array_column($users, 'name', 'id'); // [1=>'A', 2=>'B']
?>
總結建議
- 遍歷用 foreach,轉換用 array_map,過濾用 array_filter
- 排序選擇表決定函式,自然排序用 natsort
- 記憶體敏感場景考慮 Generator (yield) 避免建立巨大陣列
- 嚴格模式:in_array/array_search 第三參數設 true
- 善用 array_column 處理資料庫結果集