數組是 PHP 最核心的數據結構,掌握內置數組函數能讓代碼更簡潔、高效、符合「不重複造輪子」原則。本文按功能分類整理 50+ 高頻數組函數,附帶實戰示例、性能對比、常見陷阱與現代替代寫法。
array() / [] | 創建數組 | $a = [1, 2, 3]; $b = ['k' => 'v']; |
| range() | 創建範圍數組 | range(1, 10); range('a', 'z'); range(0, 100, 10) |
| array_fill() | 填充值 | array_fill(0, 5, 'x') // ['x','x','x','x','x'] |
| array_fill_keys() | 指定鍵填充 | array_fill_keys(['a','b'], 0) // ['a'=>0,'b'=>0] |
| compact() | 變量轉關聯數組 | compact('var1', 'var2') |
| array_column() | 提取列 (PHP 5.5+) | array_column($users, 'name', 'id') |
array_keys() | 獲取所有鍵 | array_keys($arr) |
| array_values() | 獲取所有值(重置索引) | array_values($arr) |
| array_flip() | 交換鍵值 | array_flip(['a'=>1]) // [1=>'a'] |
| array_reverse() | 反轉順序 | array_reverse([1,2,3]) // [3,2,1] |
| array_change_key_case() | 鍵名大小寫轉換 | array_change_key_case($arr, CASE_UPPER) |
| array_combine() | 合併鍵值數組 | array_combine($keys, $values) |
<?php
$arr = ['a', 'b', 'c', 'd'];
// 末尾添加
$arr[] = 'e'; // 最快
array_push($arr, 'f', 'g'); // 多值
// 開頭添加
array_unshift($arr, 'start'); // 索引重排
// 刪除末尾
$last = array_pop($arr); // 返回被刪值
// 刪除開頭
$first = array_shift($arr); // 索引重排
// 指定位置刪除/替換 (核心函數)
array_splice($arr, 1, 2, ['x', 'y']); // 從索引1刪2個,插入x,y
// 返回被刪除元素數組,原數組被修改
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 2];
in_array(2, $arr); // true (值存在)
in_array(2, $arr, true); // true (嚴格模式)
array_search(2, $arr); // 'b' (返回第一個匹配的鍵)
array_keys($arr, 2); // ['b', 'd'] (所有匹配的鍵)
array_key_exists('b', $arr); // true (檢測鍵存在)
isset($arr['b']); // true (鍵存在且非 null) — 更快
// 統計
count($arr); // 4
count($arr, COUNT_RECURSIVE); // 遞歸計數多維數組
| 函數 | 排序依據 | 保持鍵值關聯 | 順序 | 返回值 |
|---|---|---|---|---|
sort() | 值 | ❌ 重置索引 | 升序 | bool |
rsort() | 值 | ❌ | 降序 | bool |
asort() | 值 | ✅ | 升序 | bool |
arsort() | 值 | ✅ | 降序 | bool |
ksort() | 鍵 | ✅ | 升序 | bool |
krsort() | 鍵 | ✅ | 降序 | bool |
natsort() | 值(自然排序) | ✅ | 升序 | bool |
usort() | 自定義回調(值) | ❌ | 自定 | bool |
uasort() | 自定義回調(值) | ✅ | 自定 | bool |
uksort() | 自定義回調(鍵) | ✅ | 自定 | bool |
<?php
$users = [
['name' => '張三', 'age' => 25],
['name' => '李四', 'age' => 30],
['name' => '王五', 'age' => 20],
];
// 年齡升序,保持鍵
uasort($users, fn($a, $b) => $a['age'] <=> $b['age']);
// 太空船操作符 <=> (PHP 7+) 返回 -1, 0, 1
// 多字段排序:年齡升序,同齡按名字降序
uasort($users, fn($a, $b) =>
[$a['age'], $b['name']] <=> [$b['age'], $a['name']]
);
<?php
$nums = [10, 20, 30, 40, 50];
array_sum($nums); // 150
array_product($nums); // 12000000
min($nums); // 10
max($nums); // 50
// 統計值出現次數
$arr = ['a', 'b', 'a', 'c', 'b', 'a'];
array_count_values($arr); // ['a'=>3, 'b'=>2, 'c'=>1]
<?php
$a = [1, 2, 3, 4, 5];
$b = [4, 5, 6, 7, 8];
array_unique($a); // [1,2,3,4,5] (保留首次出現鍵)
array_merge($a, $b); // [1,2,3,4,5,4,5,6,7,8] (數字鍵重置)
$a + $b; // [1,2,3,4,5] (鍵不覆蓋,a優先)
array_intersect($a, $b); // [4,5] (值交集,保留a的鍵)
array_diff($a, $b); // [1,2,3] (a有b無)
array_diff_key($a, $b); // 鍵差集
array_diff_assoc($a, $b); // 鍵值對差集
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// foreach (首選,性能最好)
foreach ($arr as $k => $v) { ... }
// array_map - 映射轉換 (返回新數組)
$upper = array_map('strtoupper', ['a', 'b', 'c']); // ['A','B','C']
$sum = array_map(fn($a, $b) => $a + $b, [1,2], [10,20]); // [11,22] 多數組
// array_filter - 過濾 (保留鍵)
$even = array_filter([1,2,3,4,5], fn($n) => $n % 2 === 0); // [2,4] 鍵保留1,3
// array_reduce - 歸約
$sum = array_reduce([1,2,3,4], fn($carry, $item) => $carry + $item, 0); // 10
// array_walk - 原地修改 (無返回值)
array_walk($arr, fn(&$v, $k) => $v *= 2); // $arr 變為 [2,4,6]
// array_column - 提取列 (極其高頻)
$users = [['id'=>1,'name'=>'張三'], ['id'=>2,'name'=>'李四']];
$names = array_column($users, 'name'); // ['張三','李四']
$map = array_column($users, 'name', 'id'); // [1=>'張三', 2=>'李四']
<?php
$arr = [1, 2, 3, 4, 5];
shuffle($arr); // 原地打亂,鍵重置
array_rand($arr, 3); // 返回 3 個隨機鍵
// PHP 7.1+ 使用 Mersenne Twister,質量更好
<?php
// 遞歸遍歷
function walkRecursive(array $arr, callable $fn): void
{
array_walk_recursive($arr, $fn);
}
// 扁平化
$multi = [[1,2], [3, [4,5]]];
$flat = [];
array_walk_recursive($multi, fn($v) => $flat[] = $v); // [1,2,3,4,5]
// 多維排序
$data = [
['name' => 'A', 'score' => 80],
['name' => 'B', 'score' => 90],
];
array_multisort(array_column($data, 'score'), SORT_DESC, $data);
$doubled = array_map(fn($n) => $n * 2, $nums);
$filtered = array_filter($items, fn($item) => $item->isActive());
$merged = [...$arr1, ...$arr2]; // 數值索引重置
$mergedAssoc = [...$arr1, ...$arr2]; // 字符串鍵後者覆蓋
// 等價於 array_merge 但更快、語法更清晰
$value = $data['user']['profile']['avatar'] ?? 'default.png';
// 使用 laravel/collections 或 illuminate/support
use Illuminate\Support\Collection;
$users = collect($rawUsers)
->filter(fn($u) => $u['active'])
->sortByDesc('score')
->take(10)
->keyBy('id')
->toArray();
// 鏈式調用、不可變、類型安全、可測試
array_map/walk 快 2-3 倍array_key_exists 快$arr = array_keys(array_flip($arr)) 比 array_unique 快 (大數據)array_merge 快 (避免重建索引)array_merge 重置數字鍵 | array_merge([5=>'a'], [6=>'b']) | [5=>'a'] + [6=>'b'] | array_merge 重新索引數字鍵 |
| in_array 類型轉換陷阱 | in_array('abc', [0]) → true | in_array('abc', [0], true) | 非嚴格模式 'abc' == 0 為 true |
| array_search 返回 0 被當作 false | if (array_search(...)) | if (array_search(...) !== false) | 索引 0 在弱類型判斷為 false |
| shuffle 破壞關聯鍵 | shuffle($assocArr) | uksort($assocArr, fn() => rand(-1,1)) | shuffle 重置所有鍵 |
PHP 數組函數庫極其豐富,核心掌握 分類認知 + 嚴格模式習慣 + 性能直覺 三要素:
in_array(..., true)、array_search(...) !== false 嚴格模式習慣foreach、isset、flip+flip、生成器熟練運用這些函數,能將數十行循環判斷代碼壓縮為一行聲明式表達,代碼更易讀、少 Bug、易優化。