วิธีแก้ปัญหาขึ้นอยู่กับเวอร์ชัน PHP ที่คุณใช้ อย่างน้อยมี 2 วิธีแก้ไข:
First (PHP เวอร์ชันใหม่กว่า)
ดังที่ @JosepAlsina กล่าวไว้ก่อนหน้านี้วิธีแก้ปัญหาที่ดีที่สุดและสั้นที่สุดคือใช้array_column
ดังต่อไปนี้:
$catIds = array_column($objects, 'id');
ข้อสังเกต:
สำหรับการวนซ้ำes array
ที่มี\stdClass
อยู่ในคำถามนั้นทำได้เฉพาะกับเวอร์ชัน PHP >= 7.0
เท่านั้น แต่เมื่อใช้array
มีarray
s คุณสามารถทำเช่นเดียวกันตั้งแต่ >= 5.5
PHP
วินาที (PHP เวอร์ชันเก่ากว่า)
@Greg กล่าวใน PHP เวอร์ชันเก่าว่าสามารถทำสิ่งต่อไปนี้ได้:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
แต่ระวัง:ใน PHP เวอร์ชันที่ใหม่>= 5.3.0
กว่าควรใช้Closure
s ดังต่อไปนี้:
$catIds = array_map(function($o) { return $o->id; }, $objects);
ความแตกต่าง
วิธีแก้ปัญหาแรกสร้างฟังก์ชันใหม่และใส่ลงในแรมของคุณ ตัวรวบรวมขยะไม่ลบอินสแตนซ์ฟังก์ชันที่สร้างไว้แล้วและเรียกแล้วออกจากหน่วยความจำด้วยเหตุผลบางประการ และไม่ว่าจะเป็นอย่างไรอินสแตนซ์ฟังก์ชันที่สร้างขึ้นจะไม่สามารถถูกเรียกได้อีกเพราะเราไม่มีตัวชี้ และในครั้งต่อไปเมื่อมีการเรียกรหัสนี้ฟังก์ชันเดิมจะถูกสร้างขึ้นอีกครั้ง พฤติกรรมนี้เติมเต็มความทรงจำของคุณอย่างช้าๆ ...
ทั้งสองตัวอย่างพร้อมเอาต์พุตหน่วยความจำเพื่อเปรียบเทียบ:
BAD
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235616
4236600
4237560
4238520
...
ดี
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
นอกจากนี้ยังอาจกล่าวถึงที่นี่
ความจำรั่ว?! Garbage Collector ทำถูกต้องหรือไม่เมื่อใช้ "create_function" ภายใน "array_map"