เมื่อมี 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