PHP 陣列是鍵值有序映射,同時支援數值索引和關聯鍵,功能極其強大。本文系統整理陣列創建、輸出、檢測、增刪、查找、指針操作、遍歷、大小統計、排序、合併拆分、交集差集等核心操作,並提供最佳實踐建議。
<?php
// 1. 直接賦值 (索引自動遞增)
$state[] = '111';
$state[] = '222';
// 2. array() / [] 短語法 (PHP 5.4+)
$state = array('111', '222');
$state = ['one' => '111', 'two' => '222'];
// 3. range() 範圍填充
$num = range(1, 6); // [1,2,3,4,5,6]
$num = range(1, 6, 2); // [1,3,5] 步長
$ch = range('A', 'F'); // ['A','B','C','D','E','F']
// 4. list() 解包賦值
$state = ['one', 'two', 'three'];
list($one, $two, $three) = $state;
?>
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// 輸出調試
print_r($arr); // 結構化輸出
var_dump($arr); // 含類型信息
var_export($arr); // 可執行代碼形式
// 檢測是否陣列
is_array($arr); // true
is_array('string'); // false
?>
| 操作 | 函數 | 說明 | 返回值 |
|---|---|---|---|
| 頭部入隊 | array_unshift($arr, $val) | 數值鍵重排,關聯鍵不變 | 新長度 |
| 尾部入隊 | array_push($arr, $val) | 支援批量推入 | 新長度 |
| 頭部出隊 | array_shift($arr) | 數值鍵重排 | 被移除值 |
| 尾部出隊 | array_pop($arr) | 棧操作 | 被移除值 |
<?php
$user = ['admin', 'editor', 'viewer'];
$arr = ['one' => 1, 'two' => 2, 'three' => 3];
// 值搜索 (嚴格模式第3參數)
in_array('admin', $user); // true
in_array('1', $arr, true); // false (類型不匹配)
// 鍵搜索
array_key_exists('two', $arr); // true
isset($arr['two']); // true (更快,但值為null時為false)
// 值搜索返回鍵
array_search(2, $arr); // 'two'
// 獲取所有鍵/值
array_keys($arr); // ['one','two','three']
array_values($arr); // [1,2,3] (重新索引)
?>
<?php
$arr = ['one' => 1, 'two' => 2, 'three' => 3];
// 基本指針操作
current($arr); // 1 (當前值)
key($arr); // 'one' (當前鍵)
next($arr); // 2 (移動到下一個)
prev($arr); // 1 (移動到上一個)
reset($arr); // 1 (重置到首部)
end($arr); // 3 (移動到尾部)
each($arr); // ['1','value'=>1,'0'=>'one','key'=>'one'] + 指針後移
// 現代遍歷首選 foreach
foreach ($arr as $key => $val) { /* ... */ }
// 函數式遍歷
array_walk($arr, function($val, $key) { echo "$key=$val\n"; });
array_walk_recursive($multiArr, $callback); // 遞歸遍歷多維
?>
<?php $arr = ['A', 'B', 'C', 'A', 'B', 'A']; count($arr); // 6 count($multiArr, COUNT_RECURSIVE); // 遞歸計數 array_count_values($arr); // ['A'=>3, 'B'=>2, 'C'=>1] array_unique($arr); // ['A','B','C'] (保留首次鍵) ?>
| 函數 | 排序依據 | 順序 | 保持鍵值關聯 | 備註 |
|---|---|---|---|---|
| sort() | 值 | 升序 | 否 (重建索引) | 標志: SORT_NUMERIC/STRING/REGULAR |
| rsort() | 值 | 降序 | 否 | |
| asort() | 值 | 升序 | 是 | 關聯陣列首選 |
| arsort() | 值 | 降序 | 是 | |
| ksort() | 鍵 | 升序 | 是 | |
| krsort() | 鍵 | 降序 | 是 | |
| natsort() | 值(自然序) | 升序 | 是 | 人類直覺排序: 1,2,10,20 |
| natcasesort() | 值(自然序) | 升序 | 是 | 不區分大小寫 |
| usort() | 自定義 | - | 否 | 回調函數返回 -1/0/1 |
| uasort() | 自定義 | - | 是 | |
| uksort() | 鍵自定義 | - | 是 |
<?php $a = ['A', 'B', 'C']; $b = ['D', 'E']; // 合併 array_merge($a, $b); // ['A','B','C','D','E'] (數值鍵重排) $a + $b; // ['A','B','C'] (+ 運算符保留首次鍵) array_merge_recursive($a, $b); // 相同鍵合併為子陣列 // 合併鍵值對 array_combine(['a','b'], [1,2]); // ['a'=>1, 'b'=>2] // 切片 array_slice($arr, 1, 2); // 從索引1取2個 array_chunk($arr, 2); // 分塊: [[0,1],[2,3],...] // 交集 (保留第一個陣列的鍵) array_intersect($a1, $a2, ...); // 值交集 array_intersect_assoc($a1, $a2, ...); // 鍵值交集 array_intersect_key($a1, $a2, ...); // 鍵交集 // 差集 (只在第一個陣列中出現) array_diff($a1, $a2, ...); // 值差集 array_diff_assoc($a1, $a2, ...); // 鍵值差集 array_diff_key($a1, $a2, ...); // 鍵差集 ?>
<?php
$arr = ['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4];
array_rand($arr, 2); // 隨機取 2 個鍵
shuffle($arr); // 打亂順序 (原地修改)
array_sum($arr); // 求和 (非數值忽略)
array_product($arr); // 求積
array_reverse($arr, true); // 反轉 (true 保持鍵)
array_flip($arr); // 鍵值互換
array_map('strtoupper', $arr); // 映射處理
array_filter($arr, fn($v)=>$v>2); // 過濾
array_reduce($arr, fn($c,$v)=>$c+$v, 0); // 歸約
?>
$arr = array_flip(array_flip($arr)) 比 array_unique 快數倍更多進階技巧,請參考:《PHP 陣列(Array)操作技巧大全》、《PHP 數據結構與算法教程》、《PHP 性能優化實戰》等專題。