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

ดึง Numeric Index ของ Associative Array ใน PHP

Associative Array มี Key เป็น String แต่ภายใน PHP เก็บลำดับการ Insert (Insertion Order) สามารถดึง Index ตำแหน่งได้

วิธีที่ 1: array_keys() + Loop (มาตรฐาน)

$arr = ['a' => '5', 'b' => '20', 'c' => '35', 'd' => '55'];

$keys = array_keys($arr);
// ['a', 'b', 'c', 'd']

for ($i = 0; $i < count($arr); $i++) {
    $key = $keys[$i];
    $value = $arr[$key];
    echo "Index: $i, Key: $key, Value: $value\n";
}

/* Output:
Index: 0, Key: a, Value: 5
Index: 1, Key: b, Value: 20
Index: 2, Key: c, Value: 35
Index: 3, Key: d, Value: 55
*/

วิธีที่ 2: foreach กับ Key (เข้าถึง Index โดยตรง)

$arr = ['a' => '5', 'b' => '20', 'c' => '35', 'd' => '55'];

$index = 0;
foreach ($arr as $key => $value) {
    echo "Index: $index, Key: $key, Value: $value\n";
    $index++;
}

/* Output เหมือนข้างต้น แต่ไม่ต้อง array_keys() แยก */

วิธีที่ 3: หา Index ของ Key เฉพาะ (array_search)

$arr = ['p' => '150', 'q' => '100', 'r' => '120', 's' => '110'];

// หา Index ของ Key 'r'
$keys = array_keys($arr);
$index = array_search('r', $keys, true); // Strict Comparison

echo "Key 'r' is at index: $index"; // 2

// One-liner (PHP 7+)
$index = array_search('r', array_keys($arr), true);

วิธีที่ 4: ArrayIterator (Object-Oriented)

$arr = ['p' => '150', 'q' => '100', 'r' => '120', 's' => '110'];

$iterator = new ArrayIterator($arr);
$index = 0;

foreach ($iterator as $key => $value) {
    echo "Index: $index, Key: $key, Value: $value\n";
    $index++;
}

// Seek to Specific Index
$iterator->seek(2); // ไปที่ Index 2
echo "Key at index 2: " . $iterator->key();   // 'r'
echo "Value at index 2: " . $iterator->current(); // '120'

การ Update Value ผ่าน Index

$arr = ['p' => '150', 'q' => '100', 'r' => '120', 's' => '110'];
$keys = array_keys($arr);

// อัปเดต Index 3 (Key 's')
$arr[$keys[3]] = '25';

print_r($arr);
// ['p' => '150', 'q' => '100', 'r' => '120', 's' => '25']

⚠️ ข้อควรระวัง: Array Order

  • PHP 7+ : Array เก็บ Insertion Order (Ordered Map)
  • Key ใหม่จะเพิ่มท้ายเสมอ
  • array_merge, + operator รักษา Order
  • sort(), ksort() จะเปลี่ยน Order
$arr = ['b' => 1, 'a' => 2]; // Insert b ก่อน a
$keys = array_keys($arr); // ['b', 'a'] - รักษา Insertion Order

ksort($arr); // Sort by Key
$keys = array_keys($arr); // ['a', 'b'] - Order เปลี่ยนไป!

Benchmark

/* 100,000 Elements:
array_keys + for loop:  0.008s
foreach with counter:   0.006s  <-- เร็วกว่าเล็กน้อย
ArrayIterator:          0.012s  (Object Overhead)
*/