PHP 陣列本質是有序映射,同時支援堆疊(LIFO)與佇列(FIFO)操作:
| 操作 | 函數 | 陣列端 | 回傳值 | 時間複雜度 |
|---|---|---|---|---|
| 壓入/入佇 | array_push() | 尾端 | 新長度 (int) | O(1) 平攤 |
| 彈出/出堆疊 | array_pop() | 尾端 | 被移除的值 | O(1) |
| 前插/入佇 | array_unshift() | 頭端 | 新長度 (int) | O(n) 需重新索引 |
| 前移/出佇 | array_shift() | 頭端 | 被移除的值 | O(n) 需重新索引 |
$stack = ['orange', 'banana'];
array_push($stack, 'apple', 'raspberry'); // 尾端壓入多個
// ['orange','banana','apple','raspberry']
$fruit = array_pop($stack); // 取出並移除 'raspberry'
$queue = ['a', 'b', 'c'];
array_unshift($queue, 'first'); // 頭端插入
// ['first','a','b','c']
$first = array_shift($queue); // 取出並移除 'first'
$arr = [];
// 推薦:語法糖,無函數呼叫開銷
$arr[] = 'value';
// 避免:單元素時 array_push() 慢約 10-15%
array_push($arr, 'value');
批次壓入多個值時 array_push($arr, $v1, $v2, $v3) 仍比多次 $arr[] 略快,但差異微乎其微,優先考慮可讀性。
array_push/unshift:重新編號數值索引(0,1,2...),字串鍵名保持不變。array_pop/shift:重新編號數值索引,字串鍵名不變。$arr[123] = $val 直接指定鍵名。function pushFixed(array &$queue, $value, int $maxLen = 100): void {
$queue[] = $value;
if (count($queue) > $maxLen) {
array_shift($queue); // 移除最舊
}
}
| 函數 | 用途 |
|---|---|
array_keys() | 取得所有鍵名 |
array_values() | 重置數值索引 (0...) |
array_flip() | 交換鍵值(值必須唯一) |
array_merge() | 合併陣列(數值索引重新編號,字串鍵後者覆蓋) |
array_combine() | 兩陣列組成鍵值對 |
array_filter() | 回呼過濾 |
array_map() | 回呼映射轉換 |
array_reduce() | 歸約/累積 |
array_column() | 提取二維陣列單一欄位 (PHP 5.5+) |
array_key_exists() / isset() | 檢查鍵是否存在 (isset 更快但值為 null 回 false) |
array_shift/unshift 在大陣列 (>10 萬) 上極慢,改用 SplQueue / SplStack 或 SplDoublyLinkedList (O(1) 頭尾操作)。in_array() 大陣列查找 O(n),頻繁查找請先 $lookup = array_flip($arr) 再用 isset($lookup[$val]) O(1)。array_unique() 會重置索引且保留首次出現的鍵,大資料量慎用。