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

ดึง Property จาก Array of Objects ใน PHP

เมื่อมี Array ที่เก็บ Object (หรือ stdClass) และต้องการดึง Property เฉพาะ (เช่น id) ออกมาเป็น Array แยก

ข้อมูลตัวอย่าง

$objects = [
    (object)['id' => 12, 'name' => 'Item A'],
    (object)['id' => 33, 'name' => 'Item B'],
    (object)['id' => 59, 'name' => 'Item C'],
];

// หรือจาก JSON
$json = '[{"id":12,"name":"A"},{"id":33,"name":"B"},{"id":59,"name":"C"}]';
$objects = json_decode($json); // Array of stdClass

วิธีที่ 1: array_column (PHP 5.5+, แนะนำมากที่สุด)

$ids = array_column($objects, 'id');
// [12, 33, 59]

// รองรับ Object และ Array ทั้งคู่
$arrays = [
    ['id' => 12, 'name' => 'A'],
    ['id' => 33, 'name' => 'B'],
];
$ids = array_column($arrays, 'id'); // [12, 33]

วิธีที่ 2: array_map + Closure (PHP 5.3+, ยืดหยุ่นกว่า)

$ids = array_map(function($obj) {
    return $obj->id; // หรือ $obj['id'] ถ้าเป็น Array
}, $objects);

// แบบสั้น (PHP 7.4+)
$ids = array_map(fn($obj) => $obj->id, $objects);

วิธีที่ 3: foreach (รองรับทุก Version, ควบคุม Logic ได้ละเอียด)

$ids = [];
foreach ($objects as $obj) {
    // สามารถเพิ่มเงื่อนไขได้
    if (isset($obj->id)) {
        $ids[] = $obj->id;
    }
}

วิธีที่ 4: ArrayIterator (Memory Efficient สำหรับ Dataset ใหญ่)

$iterator = new ArrayIterator($objects);
$ids = [];

foreach ($iterator as $obj) {
    $ids[] = $obj->id;
}
// หรือ
$ids = iterator_to_array(
    new ArrayIterator($objects),
    false // false = ไม่ preserve keys
);

ดึงหลาย Property พร้อมกัน (เป็น Array of Arrays)

$data = array_map(function($obj) {
    return [
        'id'   => $obj->id,
        'name' => $obj->name,
    ];
}, $objects);

/* ผลลัพธ์:
[
    ['id' => 12, 'name' => 'Item A'],
    ['id' => 33, 'name' => 'Item B'],
    ['id' => 59, 'name' => 'Item C'],
]
*/

ดึง Property แล้ว Re-index ด้วย Key นั้น (Index by ID)

$byId = array_column($objects, null, 'id');
/* ผลลัพธ:
[
    12 => (object)['id' => 12, 'name' => 'Item A'],
    33 => (object)['id' => 33, 'name' => 'Item B'],
    59 => (object)['id' => 59, 'name' => 'Item C'],
]
*/

Benchmark (100,000 Objects)

/* ผลลัพธ์ประมาณ:
array_column:     0.008s  (เร็วที่สุด, C-level)
array_map + fn:   0.015s
foreach:          0.012s
*/
// array_column เร็วที่สุดและ Code สั้นที่สุด -> แนะนำให้ใช้เป็นหลัก

สรุป: ใช้ array_column($array, 'property_name') เป็นวิธีหลัก รองรับทั้ง Object และ Associative Array