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

รีเซ็ต Key ของ Array ใน PHP (array_values)

ใช้ 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 ใหม่ ขนาดเท่าเดิม