PHP 數組函數全景速查手冊:從創建到高級操作的分類指南與實戰模式
PHP 數組是有序映射,同時扮演列表、字典、集合、堆疊、隊列等多種數據結構。本文將 50+ 高頻數組函數按功能分類,給出簽名、典型用例、返回值陷阱、性能提示,供開發者隨時查閱。
一、 數組創建與基礎屬性
| 函數 | 簽名 | 用途 | 示例 |
array() / [] | array(mixed ...$values): array | 創建索引/關聯數組 | ['a'=>1, 'b'=>2] |
range() | range(int|string $start, int|string $end, int $step=1): array | 生成等差數列 | range(1,10,2) // [1,3,5,7,9] |
compact() | compact(string ...$varNames): array | 變量名→值 映射 | compact('a','b') |
count() | count(Countable|array $value, int $mode=COUNT_NORMAL): int | 元素個數 | COUNT_RECURSIVE 遞歸計數 |
array_key_exists() | array_key_exists(string|int $key, array $array): bool | 鍵名是否存在 | 不檢查值是否為 null |
二、 遍歷與輸出
// 1. foreach (推薦)
foreach ($arr as $key => $val) { ... }
// 2. array_walk (引用修改)
array_walk($arr, function(&$v, $k) { $v = strtoupper($v); });
// 3. array_map (返回新數組)
$upper = array_map('strtoupper', $arr);
// 4. 鍵值分離
$keys = array_keys($arr);
$vals = array_values($arr); // 重建 0 索引
三、 增刪插入(棧/隊列操作)
| 操作 | 函數 | 返回值 | 說明 |
| 尾部入棧 | array_push($arr, ...$vals) | 新長度 | 等同 $arr[] = $v 批量版 |
| 尾部出棧 | array_pop($arr) | 被彈出的值 | 空數組返回 null |
| 頭部入隊 | array_unshift($arr, ...$vals) | 新長度 | 數字鍵名重建從 0 |
| 頭部出隊 | array_shift($arr) | 被移除的值 | 數字鍵名重建從 0 |
四、 切片、拼接、重組
| 函數 | 簽名 | 關鍵差異 |
array_slice() | array_slice(array $array, int $offset, int|null $length=null, bool $preserve_keys=false): array | 不修改原數組,$preserve_keys 保留關聯鍵 |
array_splice() | array_splice(array &$array, int $offset, int|null $length=null, mixed $replacement=[]): array | 修改原數組,返回被移除元素,支持替換 |
array_merge() | array_merge(array ...$arrays): array | 字符串鍵後覆蓋前,數字鍵重建 0 索引 |
array_merge_recursive() | array_merge_recursive(array ...$arrays): array | 相同字符串鍵合併為數組,不覆蓋 |
array_combine() | array_combine(array $keys, array $values): array | 鍵值陣列長度必須相等 |
array_chunk() | array_chunk(array $array, int $length, bool $preserve_keys=false): array | 分塊為多維數組,分頁處理利器 |
五、 集合運算:交集、差集、唯一
| 函數 | 比較依據 | 鍵名保留 | 示例 |
array_intersect() | 值 | 第一個數組的鍵 | 交集 |
array_intersect_assoc() | 鍵+值 | 第一個數組的鍵 | 關聯交集 |
array_intersect_key() | 鍵 | 第一個數組的鍵 | 鍵交集 |
array_diff() | 值 | 第一個數組的鍵 | 差集 (在 A 不在 B) |
array_diff_assoc() | 鍵+值 | 第一個數組的鍵 | 關聯差集 |
array_diff_key() | 鍵 | 第一個數組的鍵 | 鍵差集 |
array_unique() | 值 (字符串比較) | 首次出現的鍵 | 去重,保留首個鍵 |
六、 隨機、搜索、統計
| 函數 | 用途 | 關鍵點 |
array_rand() | 隨機取鍵名 | 單個返標量,多個返數組 |
shuffle() | 打亂順序 | 修改原數組,重建數字鍵 |
in_array() | 值是否存在 | 第三參數 true 嚴格模式 (類型+值) |
array_search() | 搜索值返回鍵 | 找到第一個返回鍵,失敗 false |
array_sum() | 值求和 | 非數值跳過,字符串數字轉換 |
array_count_values() | 值頻次統計 | 返回 [值=>次數],僅支持標量值 |
array_column() | 提取列 | array_column($arr, 'name', 'id') 以 id 為鍵 |
七、 進階:回調函數族
// 過濾
$filtered = array_filter($arr, fn($v) => $v > 10); // 保留值
$filtered = array_filter($arr, fn($v, $k) => $k % 2 === 0, ARRAY_FILTER_USE_KEY); // 按鍵
// 走訪修改
array_walk($arr, fn(&$v, $k) => $v *= 2);
// 歸約
$sum = array_reduce($arr, fn($carry, $v) => $carry + $v, 0);
// 鍵名/值映射
$mapped = array_map(fn($v) => $v * 2, $arr); // 返回新數組
八、 避坑指南精選
| 坑點 | 現象 | 解決 |
array_merge 數字鍵重建 | array_merge([5=>'a'], [6=>'b']) 返回 [0=>'a', 1=>'b'] | 需保留鍵用 + 運算符:$a + $b |
in_array 類型轉換陷阱 | in_array('abc', [0]) 返回 true | 嚴格模式 in_array('abc', [0], true) |
array_unique 保留首個鍵 | 關聯數組去重後鍵名可能非預期 | 去重後 array_values() 重建索引 |
shuffle 破壞關聯鍵 | 關聯數組打亂後鍵名重建為 0,1,2... | 需保留鍵:uksort($arr, fn() => rand(-1,1)) |
大數組 array_diff 性能 | 百萬級差集耗時秒級 | 鍵差集用 array_diff_key;值差集建立翻轉索引 |
九、 實戰模式:分頁處理大數組
function processInChunks(array $data, int $chunkSize, callable $handler): void
{
foreach (array_chunk($data, $chunkSize, true) as $chunk) {
$handler($chunk);
// 可選:釋放內存
unset($chunk);
}
}
// 使用
processInChunks($hugeArray, 1000, function($chunk) {
// 批量入庫、發送隊列、寫入文件
Model::insert($chunk);
});
十、 結語
PHP 數組函數庫極其豐富,掌握「創建→遍歷→增刪→切片→合併→集合運算→隨機/統計」七大分類核心函數,並牢記 array_merge 數字鍵重建、in_array 嚴格模式、shuffle 破壞關聯鍵三大經典坑點,即可應對 95% 的業務場景。大數據量場景請優先考慮 array_chunk 分批處理、Generator 流式處理或遷移至 Redis/數據庫集合運算。