首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 陣列操作核心函數:FIFO/LIFO、鍵值處理、效能比較與實戰技巧

     編輯:PHP 綜合知識

陣列作為堆疊與佇列

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[] = $val vs array_push()

$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 直接指定鍵名。

實戰模式:固定長度佇列(如最近 N 筆日誌)

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() 會重置索引且保留首次出現的鍵,大資料量慎用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved