array_shift(array &$array): mixed
<?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' 不變
)
*/
$queue = [];
array_push($queue, 'task1', 'task2', 'task3'); // 入隊 (尾部)
while ($queue) {
$task = array_shift($queue); // 出隊 (頭部)
echo "處理: $task\n";
}
// 輸出: task1, task2, task3
> ⚠️ **效能警告**:`array_shift` 需重設所有後續數字索引,**O(n)**。百萬級佇列會極慢。
$q = new SplQueue();
$q->enqueue('task1');
$q->enqueue('task2');
$q->enqueue('task3');
while (!$q->isEmpty()) {
$task = $q->dequeue(); // O(1)
echo "處理: $task\n";
}
// 記憶體穩定、速度恆定
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 筆記