Giải pháp phụ thuộc vào phiên bản PHP bạn đang sử dụng. Ít nhất có 2 giải pháp:
Đầu tiên (Phiên bản PHP mới hơn)
Như @JosepAlsina đã nói trước giải pháp tốt nhất và cũng ngắn nhất là sử dụng array_column
như sau:
$catIds = array_column($objects, 'id');
Lưu ý:
Để lặp lại một es array
có chứa \stdClass
như được sử dụng trong câu hỏi, chỉ có thể với các phiên bản PHP >= 7.0
. Nhưng khi sử dụng một s array
có chứa array
bạn có thể làm tương tự kể từ PHP >= 5.5
.
Thứ hai (Phiên bản PHP cũ hơn)
@Greg cho biết trong các phiên bản PHP cũ hơn có thể thực hiện như sau:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
Nhưng hãy cẩn thận: Trong các phiên bản PHP mới hơn >= 5.3.0
, tốt hơn là sử dụng Closure
s, như sau:
$catIds = array_map(function($o) { return $o->id; }, $objects);
Sự khác biệt
Giải pháp đầu tiên tạo ra một chức năng mới và đưa nó vào RAM của bạn. Vì một số lý do, trình thu gom rác không xóa cá thể hàm đã được tạo và đã gọi ra khỏi bộ nhớ. Và bất kể thực tế là gì, cá thể hàm được tạo không bao giờ có thể được gọi lại, bởi vì chúng ta không có con trỏ cho nó. Và lần sau khi mã này được gọi, chức năng tương tự sẽ được tạo lại. Hành vi này từ từ lấp đầy bộ nhớ của bạn ...
Cả hai ví dụ với đầu ra bộ nhớ để so sánh chúng:
XẤU
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
...
TỐT
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Điều này cũng có thể được thảo luận ở đây
Bộ nhớ bị rò rỉ?! Garbage Collector có hoạt động tốt khi sử dụng 'create_function' trong 'Array_map' không?