PHP 提供多種內建函式操作陣列首尾元素,理解其行為差異、回傳值與副作用,能避免常見 Bug 並寫出更清晰的程式碼。本文詳細比較 array_shift、array_pop 與 array_splice 三種方法。
<?php
$fruits = ['apple', 'banana', 'orange'];
// 刪除並取得最後一個元素
$last = array_pop($fruits);
echo "被刪除元素: {$last}\n"; // 輸出: orange
echo "剩餘陣列: ";
print_r($fruits); // 輸出: Array ( [0] => apple [1] => banana )
?>
NULL<?php
$fruits = ['apple', 'banana', 'orange'];
// 刪除並取得第一個元素
$first = array_shift($fruits);
echo "被刪除元素: {$first}\n"; // 輸出: apple
echo "剩餘陣列: ";
print_r($fruits); // 輸出: Array ( [0] => banana [1] => orange )
?>
NULLarray_pop 差<?php $fruits = ['apple', 'banana', 'orange']; // 刪除第一個元素(位移 0,長度 1) $removed = array_splice($fruits, 0, 1); echo "被刪除元素: "; print_r($removed); // 輸出: Array ( [0] => apple ) echo "剩餘陣列: "; print_r($fruits); // 輸出: Array ( [0] => banana [1] => orange ) // 進階:一次刪除前兩個並插入新元素 $fruits = ['apple', 'banana', 'orange']; array_splice($fruits, 0, 2, ['grape', 'pear']); // 結果: ['grape', 'pear', 'orange'] ?>
| 特性 | array_shift() | array_splice($arr, 0, 1) |
|---|---|---|
| 回傳值 | 單一元素值 | 包含被刪元素的陣列 |
| 原陣列修改 | 是(重新索引) | 是(重新索引) | 靈活度 | 僅限首元素 | 可指定位置、長度、替換 |
| 函式 | 操作位置 | 回傳值 | 鍵名重索引 | 常見用途 |
|---|---|---|---|---|
| array_pop() | 陣列尾端 | 單一元素值 / NULL | 數字鍵名重索引 | 堆疊彈出、移除最後項目 |
| array_shift() | 陣列首端 | 單一元素值 / NULL | 數字鍵名重索引 | 隊列出隊、處理第一項目 |
| array_splice() | 任意位置 | 被刪除元素組成的陣列 | 數字鍵名重索引 | 區間刪除/替換/插入 |
if (!empty($arr)) 避免 NULL 導致後續邏輯錯誤array_shift,改用索引指標或 array_reverse + array_pop$firstItem = array_shift($queue) 增加可讀性<?php // ❌ 錯誤:直接在空陣列操作 $empty = []; $val = array_shift($empty); // $val = NULL,後續若直接用 $val['key'] 會報錯 // ✅ 正確:先檢查 $val = $empty ? array_shift($empty) : null; // ❌ 錯誤:誤以為 array_splice 回傳單一值 $first = array_splice($arr, 0, 1); // $first 是陣列! $name = $first['name']; // 錯誤:應為 $first[0]['name'] // ✅ 正確:取第一個被刪除元素 $removed = array_splice($arr, 0, 1); $first = $removed[0] ?? null; ?>
掌握這三個函式的細微差別,能讓陣列操作更精準、效能更優、程式碼更易維護。