數組是 PHP 最強大的數據結構。本文系統整理數組核心函數:創建、提取、檢測、首尾增刪(棧/隊列)、鍵值操作、遍歷、合併拆分,附代碼示例與性能提示。
<?php
// 1. array() / [] 短語法
$arr = ['a', 'b', 'c'];
$assoc = ['name' => 'Tom', 'age' => 25];
// 2. range() 快速生成序列
$nums = range(1, 100); // 1..100
$even = range(2, 100, 2); // 2,4,6..100
$letters = range('a', 'z'); // a..z
// 3. array_fill() 填充固定值
$arr = array_fill(0, 10, 'default'); // 10 個 'default'
// 4. array_combine() 鍵值組合
$keys = ['a','b','c']; $vals = [1,2,3];
$arr = array_combine($keys, $vals); // ['a'=>1, 'b'=>2, 'c'=>3]
?>
<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
// 提取值到變量
list($a, $b, $c) = $arr; // $a=1, $b=2, $c=3
// 或跳過
list(, $b,) = $arr; // 只取 $b
// 檢測是否數組
is_array($arr); // true
is_array('str'); // false
// 檢測鍵是否存在
array_key_exists('a', $arr); // true
isset($arr['a']); // true (值非 null)
?>
| 操作 | 函數 | 行為 | 返回值 | 時間複雜度 |
|---|---|---|---|---|
| 隊列入隊(尾部進) | array_push($arr, $v) | 尾部添加,支持多值 | 新長度 | O(1) 攤銷 |
| 隊列出隊(尾部出) | array_pop($arr) | 移除並返回尾部元素 | 元素值 | O(1) |
| 棧入棧(頭部進) | array_unshift($arr, $v) | 頭部添加,數字鍵重排 | 新長度 | O(n) 需移動 |
| 棧出棧(頭部出) | array_shift($arr) | 移除並返回頭部元素 | 元素值 | O(n) 需移動 |
<?php
$stack = ['orange', 'banana'];
array_push($stack, 'apple', 'raspberry'); // ['orange','banana','apple','raspberry']
$fruit = array_pop($stack); // 'raspberry', $stack=['orange','banana','apple']
$queue = ['a','b'];
array_unshift($queue, 'first'); // ['first','a','b']
$first = array_shift($queue); // 'first', $queue=['a','b']
// 性能提示:尾部操作快,頭部操作慢(需重排索引)
// 高頻頭部操作請用 SplDoublyLinkedList
?>
<?php
$arr = ['a'=>1, 'b'=>2, 'c'=>3];
// 獲取所有鍵/值
array_keys($arr); // ['a','b','c']
array_values($arr); // [1,2,3] (重建數字索引)
// 翻轉鍵值(值必須唯一)
$flipped = array_flip($arr); // [1=>'a', 2=>'b', 3=>'c']
// 反轉順序
array_reverse($arr); // ['c'=>3, 'b'=>2, 'a'=>1] (保留鍵)
array_reverse($arr, true); // 保留鍵關聯
// 合併數組
$arr1 = ['a'=>1]; $arr2 = ['b'=>2, 'a'=>99];
$merged = array_merge($arr1, $arr2); // ['a'=>99, 'b'=>2] 後者覆蓋同名鍵
$merged = $arr1 + $arr2; // ['a'=>1, 'b'=>2] + 運算符:先來優先
// 拆分數組
list($first, $rest) = [array_shift($arr), $arr]; // 手動拆分
// 或 array_slice
$slice = array_slice($arr, 1, 2); // 從索引1取2個
?>
<?php
$arr = ['a'=>1, 'b'=>2, 'c'=>3];
// 1. foreach (推薦,可引用修改)
foreach ($arr as $k => &$v) { $v *= 2; }
unset($v); // 解除引用
// 2. array_map (返回新數組)
$doubled = array_map(fn($v) => $v*2, $arr);
// 3. array_walk (原地修改,支持額外參數)
array_walk($arr, fn(&$v, $k, $mul) => $v *= $mul, 3);
// 4. array_filter / array_reduce
$evens = array_filter($arr, fn($v) => $v%2===0);
$sum = array_reduce($arr, fn($carry, $v) => $carry+$v, 0);
?>
[]= / array_push / array_pop 比頭部操作快數量級for($i=0,$n=count($arr); $i<$n; $i++)array_unique 較慢,鍵值翻轉法 array_flip(array_flip($arr)) 更快foreach ($arr as &$v) 循環後 unset($v),否則後續操作會修改最後一個元素array_is_list() 判斷是否列表(連續數字鍵從 0 開始)