許多開發者誤以為 unset($arr[$key]) 會自動重排數字索引,實則不然——它只移除元素,保留原索引鍵,導致索引不連續。需用 array_splice() 實現真正的「刪除並重建索引」。
<?php
$arr = array('a','b','c','d');
unset($arr[1]);
print_r($arr);
// 輸出:Array ( [0] => a [2] => c [3] => d ) ← 索引 1 消失,未重排
$arr = range(5, 10); // [5,6,7,8,9,10]
unset($arr[1]);
print_r($arr);
// 輸出:Array ( [0] => 5 [2] => 7 [3] => 8 [4] => 9 [5] => 10 ) ← 同理
?>
<?php
$arr = array('a','b','c','d');
array_splice($arr, 1, 1); // 從索引 1 刪除 1 個元素
print_r($arr);
// 輸出:Array ( [0] => a [1] => c [2] => d ) ← 索引重建為 0,1,2
?>
| 函數 | 行為 | 索引重建 | 適用場景 |
|---|---|---|---|
unset($arr[$key]) | 移除指定鍵值 | ❌ 否 | 關聯陣列、不需連續索引 |
array_splice($arr, $offset, $length) | 切割並移除區段 | ✅ 是(數字鍵) | 數字索引陣列、需保持連續 |
array_values($arr) | 重新索引數值 | ✅ 是 | 事後補救、配合 unset 使用 |
array_splice() 一步到位unset() 即可,鍵名本身有語意不需連續array_splice($arr, 2, 3) 從索引 2 刪 3 個SplFixedArray 或重新組裝核心觀念:
unset()是「拔掉某格」,array_splice()是「剪掉一段再接上」。根據資料結構語意選擇正確工具。