使用 unset($arr[1]) 刪除數組元素後,鍵名不會自動重排:
<?php
$arr = array('a','b','c','d');
unset($arr[1]);
print_r($arr);
// 輸出:Array ( [0] => a [2] => c [3] => d )
?>
鍵名 1 缺失,後續元素鍵名保持不變,導致索引不連續。
array_splice() 可刪除指定位置元素並自動重建索引:
<?php
$arr = array('a','b','c','d');
array_splice($arr, 1, 1); // 從索引1開始,刪除1個元素
print_r($arr);
// 輸出:Array ( [0] => a [1] => c [2] => d )
?>
array_splice(array &$array, int $offset, int $length = ?, mixed $replacement = []): array
$offset:起始位置,0 為第一個元素,負數從末尾倒數。$length:刪除數量,省略則刪除到結尾。$replacement:可選,用新元素替換被刪除部分。$arr = ['a','b','c','d'];
array_splice($arr, 2, 1); // 刪除 'c'
// 結果:['a','b','d']
$arr = ['a','b','c','d','e'];
array_splice($arr, 1, 3); // 刪除 'b','c','d'
// 結果:['a','e']
$arr = ['a','b','c','d'];
array_splice($arr, 1, 2, ['x','y']); // 刪除 'b','c',插入 'x','y'
// 結果:['a','x','y','d']
$arr = ['a','b','c','d'];
array_splice($arr, -2, 1); // 刪除倒數第2個 'c'
// 結果:['a','b','d']
| 場景 | 推薦函數 | 理由 |
|---|---|---|
| 需保留鍵名關聯、不重建索引 | unset() | 性能略高,保持原鍵名 |
| 需連續數字索引、類似列表操作 | array_splice() | 自動重建 0 起始索引 |
| 需同時刪除並插入新元素 | array_splice() | 原子操作,代碼更簡潔 |
| 刪除關聯數組指定鍵 | unset($arr['key']) | array_splice 不支持鍵名操作 |
function array_remove(&$array, $offset, $length = 1) {
if (!is_array($array)) return false;
return array_splice($array, $offset, $length);
}
// 使用
$list = ['a','b','c','d'];
array_remove($list, 1); // 刪除索引1
print_r($list); // ['a','c','d']
unset() 僅銷毀變量,不改變數組索引結構。array_splice() 是處理「類列表」數組刪除、插入、替換的標準工具,會自動重建連續數字索引。unset(),索引數組用 array_splice()。