很多初學者嘗試用 $arr[$key] = null 或 '' 來「刪除」數組元素,實際上這只是賦值,鍵名依然存在。本文通過對比演示正確與錯誤做法的區別。
<?php
$stu = ['張三', '李四', '王五'];
// ❌ 賦值 null
$stu[1] = null;
var_dump($stu);
/*
array(3) {
[0]=> string(6) "張三"
[1]=> NULL // 鍵 1 仍存在,值為 null
[2]=> string(6) "王五"
}
*/
// ❌ 賦值空字符串
$stu[1] = '';
var_dump($stu); // [1] => string(0) ""
// ❌ 賦值 false
$stu[1] = false;
var_dump($stu); // [1] => bool(false)
?>
<?php
$stu = ['張三', '李四', '王五'];
// ✅ 真正刪除元素
unset($stu[1]);
var_dump($stu);
/*
array(2) {
[0]=> string(6) "張三"
[2]=> string(6) "王五" // 鍵 1 完全消失,鍵 2 保持不變 (非連續)
}
*/
?>
| 操作 | 鍵名是否存在 | count() 結果 | foreach 遍歷 | 適用場景 |
|---|---|---|---|---|
unset($arr[$k]) | ❌ 刪除 | 減 1 | 不遍歷該元素 | 真正刪除 |
$arr[$k] = null | ✅ 保留 | 不變 | 遍歷到 (值為 null) | 標記為空值,保留結構 |
$arr[$k] = '' | ✅ 保留 | 不變 | 遍歷到 (空字符串) | 清空內容,保留佔位 |
$arr[$k] = false | ✅ 保留 | 不變 | 遍歷到 (bool false) | 布爾標記 |
unset() 後鍵名不連續,若需 0-based 連續索引:
<?php $arr = ['a', 'b', 'c']; unset($arr[1]); // ['a', 2=>'c'] $arr = array_values($arr); // 重新索引 => ['a', 'c'] ?>
<?php
$arr = ['a','b','c','d','e'];
// 批量刪除
unset($arr[1], $arr[3]); // 刪除 b, d
// 條件刪除
foreach ($arr as $k => $v) {
if ($v === 'c') unset($arr[$k]);
}
// 注意:foreach 遍歷時 unset 當前鍵安全,但不要 unset 其他鍵後繼續用 $v
?>