<?php
$a = array("red", "green", "blue", "yellow");
echo count($a); // 4
unset($a[1]); // 刪除第 2 元素
echo count($a); // 3
echo $a[2]; // blue(索引未重排!)
echo $a[1]; // 無值(洞)
?>
特性:元素數減少,但鍵名保持原狀,產生「稀疏陣列」(索引有洞)。
<?php
$a = array("red", "green", "blue", "yellow");
echo count($a); // 4
array_splice($a, 1, 1); // 從索引 1 刪除 1 個
echo count($a); // 3
echo $a[2]; // yellow(索引重排!)
echo $a[1]; // blue
?>
特性:元素刪除後自動重排數字索引(0,1,2...),字串鍵不受影響。
array array_splice(array &$input, int $offset[, int $length[, mixed $replacement]])
| 參數 | 說明 |
|---|---|
| $input | 目標陣列(傳址修改) |
| $offset | 起始位置;正數從開頭,負數從結尾 |
| $length | 刪除/替換元素數;省略=到結尾;負數=從結尾往前 |
| $replacement | 替換值(陣列/純量);省略=單純刪除 |
<?php
$a = [1,2,3,4,5];
// 替換:索引 1 起 2 個元素換成 [x,y]
array_splice($a, 1, 2, ['x','y']);
// 結果:[1, 'x', 'y', 4, 5]
// 插入:不刪除任何元素(length=0)
array_splice($a, 2, 0, 'new');
// 結果:[1, 'x', 'new', 'y', 4, 5]
// 從倒數第 2 開始刪 1 個
array_splice($a, -2, 1);
// 結果:[1, 'x', 'new', 'y', 5]
?>
| 需求 | 推薦函數 | 理由 |
|---|---|---|
| 刪除後需連續索引(列表語意) | array_splice() | 自動重排,無索引洞 |
| 保留原鍵名關聯(字典/關聯陣列) | unset() | 不改動其他鍵 |
| 同時刪除並插入新元素 | array_splice() | 原子性替換 |
| 刪除多個離散鍵 | unset() 多次 / array_diff_key() | 彈性高 |
unset($arr) 會銷毀整個陣列變數,非清空內容(清空用 $arr = [])foreach 迴圈中 unset() 當前元素安全,但 array_splice() 會破壞迴游標列表語意用 array_splice(),關聯語意用 unset()。理解索引重排行為是避免「索引洞」導致邏輯錯誤的關鍵。