เมื่อลบ Element ออกจาก Array ด้วย unset() Key จะไม่ Re-index เอง ต้องใช้ array_values() ต่อ
ขั้นตอนมาตรฐาน
$arr = ['John', 'Jacob', 'Tom', 'Tim'];
// 1. Trim Whitespace (ถ้ามี)
$arr = array_map('trim', $arr);
// 2. ลบ Element ที่ Index 1 ('Jacob')
unset($arr[1]);
// 3. Re-index Keys
$arr = array_values($arr);
print_r($arr);
/*
Array
(
[0] => John
[1] => Tom
[2] => Tim
)
*/
ฟังก์ชันครบวงจร: Remove by Value + Re-index
/**
* ลบ Element ตาม Value (First Match) และ Re-index
*/
function removeValue(array &$array, $value): bool {
$key = array_search($value, $array, true); // Strict Comparison
if ($key !== false) {
unset($array[$key]);
$array = array_values($array);
return true;
}
return false;
}
$fruits = ['apple', 'banana', 'orange', 'banana'];
removeValue($fruits, 'banana'); // ลบ 'banana' ตัวแรก
print_r($fruits); // ['apple', 'orange', 'banana']
ฟังก์ชัน: Remove by Key + Re-index
function removeKey(array &$array, $key): bool {
if (array_key_exists($key, $array)) {
unset($array[$key]);
$array = array_values($array);
return true;
}
return false;
}
ลบหลาย Element พร้อมกัน (Multiple Keys/Values)
$arr = ['a', 'b', 'c', 'd', 'e', 'f'];
// ลบหลาย Key
unset($arr[1], $arr[3]); // ลบ 'b' และ 'd'
$arr = array_values($arr);
// ['a', 'c', 'e', 'f']
// ลบหลาย Value (เก็บเฉพาะที่ไม่อยู่ใน Blacklist)
$blacklist = ['b', 'd'];
$arr = array_values(array_diff($arr, $blacklist));
// array_diff: Key เดิม -> ต้อง array_values() ต่อ
Filter + Re-index ในขั้นตอนเดียว (PHP 7.4+)
$arr = ['John', 'Jacob', 'Tom', 'Tim'];
// ลบที่ขึ้นต้นด้วย 'J' และ Re-index
$arr = array_values(
array_filter($arr, fn($v) => !str_starts_with($v, 'J'))
);
// ['Tom', 'Tim']
Associative Array: ลบ Key และ Re-index (กลายเป็น Indexed)
$assoc = ['name' => 'John', 'age' => 30, 'city' => 'NYC'];
// ลบ 'age'
unset($assoc['age']);
// array_values() จะทำให้กลายเป็น Indexed Array (Lost Keys)
$indexed = array_values($assoc);
// ['John', 'NYC']
// ถ้าต้องการเก็บ Key ให้ใช้ array_filter + ARRAY_FILTER_USE_KEY
$filtered = array_filter($assoc, fn($k) => $k !== 'age', ARRAY_FILTER_USE_KEY);
// ['name' => 'John', 'city' => 'NYC'] - Keys คงอยู่
⚠️ ข้อผิดพลาดที่พบบ่อย
// ❌ ผิด: foreach + unset ใน Loop เดียวกัน
foreach ($arr as $key => $value) {
if ($value === 'remove') {
unset($arr[$key]); // Warning: Array was modified during iteration
}
}
// ✅ ถูก: Collect Keys ก่อน
$keysToRemove = [];
foreach ($arr as $key => $value) {
if ($value === 'remove') {
$keysToRemove[] = $key;
}
}
foreach ($keysToRemove as $key) {
unset($arr[$key]);
}
$arr = array_values($arr);
// ✅ หรือ ใช้ array_filter (Cleaner)
$arr = array_values(array_filter($arr, fn($v) => $v !== 'remove'));