简体   繁体   中英

Why is array_filter returning a reference?

I would like to understand the difference between these two ( $bookingRows is an array of objects with different properties).

$vehicleRows = [];
foreach($bookingRows as $row) {
 if($row->GroupCode == 'F') {
   $vehicleRows[] = clone $row;
 }
}

and

$vehicleRows = array_values(
 array_filter($bookingRows, function ($row) {
   return $row->GroupCode == 'F';
 })
);

My problem is that if I modify something in the $vehicleRows array, it reflects these changes in the origin, $bookingRows , as well -- which is not what I want. How can I avoid such an unwanted reference between the origin and the filtered set of items?

Why does your code use clone ? Because otherwise it produces the same result as array_filter() .

array_filter() is not the culprit here, the PHP objects are manipulated through a handle. That handle is copied on assignments and this is what array_filter() does. The objects are not duplicated unless one uses clone to explicitly duplicate them.

The PHP documentation page about objects mentions this behaviour:

PHP treats objects in the same way as references or handles, meaning that each variable contains an object reference rather than a copy of the entire object. See Objects and References .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM