a
[2] => c <-- 索引跳號!非連續
[3] => d
)
*/
?>
unset 只銷毀值,**保留原鍵名**,導致數值索引出現斷層。
a
[1] => c <-- 重新索引連續
[2] => d
)
*/
?>
優點:單行搞定刪除+重索引、支援長度參數可批次刪除、原陣列引用修改。
a, 1=>c, 2=>d] ?>
優點:適用於任意鍵名混亂情況、語意清晰「取值重組」。
$v !== $valToRemove)); // 結果: ['a', 'c', 'd'] // 方法三:陣列差集 (保留鍵名需再值) $arr = array_values(array_diff($arr, [$valToRemove])); ?>
1, 'name'=>'John', 'email'=>'john@example.com']; unset($assoc['name']); // 關鍵名陣列通常不需重新索引 (鍵名有語意) // 但若需轉為數值索引: $indexed = array_values($assoc); // [1, 'john@example.com'] ?>
array_splice: ~12ms, 原地修改,記憶體穩定 array_values: ~8ms, 建立新陣列,峰值記憶體 2x unset+foreach: ~15ms, 手動重建,彈性最大 array_filter: ~10ms, 內建優化,需 PHP 7.4+ 箭頭函數
1, 'name'=>'A'],
['id'=>2, 'name'=>'B'],
['id'=>3, 'name'=>'C'],
];
// 刪除 id=2 的用戶並重新索引
$users = array_values(array_filter($users, fn($u) => $u['id'] !== 2));
/*
Array
(
[0] => Array([id]=>1 [name]=>A)
[1] => Array([id]=>3 [name]=>C)
)
*/
?>
| 場景 | 推薦 | 理由 |
|---|---|---|
| 刪除指定索引單一元素 | array_splice($arr, $idx, 1) | 原地、單行、語意精確 |
| 刪除指定值所有元素 | array_values(array_filter(...)) | 函數式、不可變風格 |
| 任意鍵名混亂需重組 | array_values($arr) | 通用、清晰 |
| 需保留原陣列引用 | array_splice | 就地修改 |
| PHP < 5.4 環境 | foreach 重建 | 相容性 |