ใช้ array_values() เพื่อ Re-index Array ให้เป็น Numeric Index เรียง 0, 1, 2... ไม่ว่าจะเป็น Associative Array หรือ Array ที่มี Key ช่วงว่าง
ตัวอย่างพื้นฐาน
$arr = ['p' => '150', 'q' => '100', 'r' => '120', 's' => '110'];
echo "Before:\n";
var_dump($arr);
/*
array(4) {
["p"]=> string(3) "150"
["q"]=> string(3) "100"
["r"]=> string(3) "120"
["s"]=> string(3) "110"
}
*/
$reindexed = array_values($arr);
echo "After array_values():\n";
var_dump($reindexed);
/*
array(4) {
[0]=> string(3) "150"
[1]=> string(3) "100"
[2]=> string(3) "120"
[3]=> string(3) "110"
}
*/
กรณี Key เป็นตัวเลขแต่ไม่เรียง/มีช่องว่าง
$arr = [8 => 'Ben', 4 => 'Kevin', 7 => 'Mark', 3 => 'Hanks'];
var_dump(array_values($arr));
/*
array(4) {
[0]=> string(3) "Ben"
[1]=> string(5) "Kevin"
[2]=> string(4) "Mark"
[3]=> string(5) "Hanks"
}
*/
หลัง unset() ต้อง array_values() เสมอ
$arr = ['a', 'b', 'c', 'd', 'e'];
unset($arr[2]); // ลบ 'c'
var_dump($arr);
/*
array(4) {
[0]=> 'a'
[1]=> 'b'
[3]=> 'd' <-- Key 3! (Key 2 หาย)
[4]=> 'e'
}
*/
$arr = array_values($arr); // Re-index
var_dump($arr);
/*
array(4) {
[0]=> 'a'
[1]=> 'b'
[2]=> 'd' <-- กลายเป็น Key 2
[3]=> 'e'
}
*/
ฟังก์ชันช่วย: Re-index หลาย Array พร้อมกัน
function reindexArrays(array &...$arrays): void {
foreach ($arrays as &$arr) {
$arr = array_values($arr);
}
}
$a = [5 => 'x', 10 => 'y'];
$b = [3 => 'p'];
reindexArrays($a, $b);
// $a = ['x', 'y'], $b = ['p']
ความแตกต่าง: array_values vs array_keys vs array_merge
$arr = ['x' => 1, 'y' => 2];
array_values($arr); // [1, 2] - Values Only, Re-indexed
array_keys($arr); // ['x', 'y'] - Keys Only
array_merge($arr); // [1, 2] - เท่ากับ array_values() สำหรับ Single Array (แต่ช้ากว่า)
⚠️ ข้อควรระวัง
array_values()คืนค่า Array ใหม่ (ไม่ Modify Original)- Reference ถูกทำลาย:
$ref = &$arr[0]; $arr = array_values($arr);-> $ref ยังชี้เดิม แต่ Array ใหม่ - Memory: สร้าง Array ใหม่ ขนาดเท่าเดิม