Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ลบ Element ออกจาก Array และ Re-index ใน PHP

เมื่อลบ 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'));