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

PHP array_shift() 移除並回傳陣列第一個元素:重設數字索引、佇列應用與效能警告

     編輯:PHP 相關知識

函式簽名

array_shift(array &$array): mixed
  • **參考傳遞** 修改原陣列
  • 移除並回傳**第一個元素** (索引 0)
  • **數字索引重設**為 0 起始連續,**字串鍵名保持不變**
  • 空陣列或非陣列回傳 `null`

基本範例

<?php
$arr = ['orange', 'banana', 'apple'];
$first = array_shift($arr);

var_dump($first); // 'orange'
print_r($arr);
/*
Array
(
    [0] => banana
    [1] => apple
)
*/

// 關聯陣列
$assoc = ['a' => 1, 0 => 'first', 'b' => 2];
$val = array_shift($assoc);
var_dump($val); // 1 (鍵 'a' 的值)
print_r($assoc);
/*
Array
(
    [0] => first   // 原數字鍵 0 重設為 0 (值不變)
    [b] => 2       // 字串鍵 'b' 不變
)
*/

實戰:標準佇列 (FIFO)


$queue = [];
array_push($queue, 'task1', 'task2', 'task3'); // 入隊 (尾部)

while ($queue) {
    $task = array_shift($queue); // 出隊 (頭部)
    echo "處理: $task\n";
}
// 輸出: task1, task2, task3
> ⚠️ **效能警告**:`array_shift` 需重設所有後續數字索引,**O(n)**。百萬級佇列會極慢。

高效能替代:SplQueue (雙向鏈表)


$q = new SplQueue();
$q->enqueue('task1');
$q->enqueue('task2');
$q->enqueue('task3');

while (!$q->isEmpty()) {
    $task = $q->dequeue(); // O(1)
    echo "處理: $task\n";
}
// 記憶體穩定、速度恆定

進階:Generator 實作無限佇列


function queueGenerator(callable $producer): Generator {
    $buffer = [];
    while (true) {
        while ($buffer) {
            yield array_shift($buffer);
        }
        $batch = $producer(); // 如從 DB/Redis 批次拉取
        if (!$batch) break;
        $buffer = array_values($batch); // 確保數字索引
    }
}

foreach (queueGenerator(fn() => fetchBatch(100)) as $task) {
    process($task);
}

常見錯誤

錯誤說明
對空陣列呼叫回傳 `null`,後續用字串函式會報錯
期望保留數字索引必重設,需用 `SplQueue` 或手動管理偏移量
關聯陣列字串鍵被移除第一個元素若為字串鍵,該鍵值對會被移除

原文摘自 zuodefeng 筆記

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved