Edit report at http://bugs.php.net/bug.php?id=51986&edit=1
ID: 51986 Updated by: cataphr...@php.net Reported by: daniel dot menard at ehesp dot fr Summary: array_filter breaks references when a callback is used -Status: Verified +Status: Analyzed Type: Bug Package: Arrays related Operating System: Windows XP PHP Version: 5.3.2 -Assigned To: cataphract +Assigned To: dmitry Block user comment: N New Comment: Sorry, it doesn't work on trunk, it works on my patched trunk :p Fixing bug #52940 would fix this. However, the patch for that bug has one effect that changes the current behavior of call_user_func_array (removes check for internal function) and another change when the refcount of the zval is <= 1 and it's a reference (a rare case). Attached a patch that changes as little as possible, yet fixes this bug. Previous Comments: ------------------------------------------------------------------------ [2010-09-29 13:05:51] cataphr...@php.net Reproducible on PHP 5.3, but not on trunk. ------------------------------------------------------------------------ [2010-06-03 14:29:38] daniel dot menard at ehesp dot fr Thanks for your comment: your workaround works. However, having to redefine standard php functions like trim() or count() just to be able to use them with array_filter() is not very convenient, is it? The fact is that the function behaviour changed in a "revision release" which should not have broken my code... ;-) ------------------------------------------------------------------------ [2010-06-03 13:00:43] sjo...@php.net Use a reference in your callback function: function my_trim(& $a) { return trim($a); } ------------------------------------------------------------------------ [2010-06-03 12:28:24] daniel dot menard at ehesp dot fr Description: ------------ I have an array and a variable which is a reference on some element in this array: $arr=array('a'); $ref = &$arr[0] If I apply array_filter() with a callback like trim() or count() on the array, the reference is broken and $ref is no longer a reference (If I apply array_filter() without a callback, the reference is not altered and the result is correct). I think that this is a regression introduced in php 5.2.11: with the test script below, 5.2.10 give the good result, 5.2.11 do not. I also tested with the latest version (5.3.2): same result, reference is broken. PS: I tested on windows XP with packages php-5.x.y-Win32-VC6-x86.zip provided on this page: http://windows.php.net/downloads/releases/archives/ Test script: --------------- // Init $arr = array('some value'); $ref = & $arr[0]; // Change $arr $arr[0] = 'ONE'; echo 'step 1. $ref is ', ($ref !== 'ONE') ? 'BROKEN' : 'OK', "\n"; // Apply array_filter (without callback) and change $arr array_filter($arr); $arr[0] = 'TWO'; echo 'step 2. $ref is ', ($ref !== 'TWO') ? 'BROKEN' : 'OK', "\n"; // Apply array_filter (with a callback) then change $arr array_filter($arr,'trim'); $arr[0] = 'THREE'; echo 'step 3. $ref is ', ($ref !== 'THREE') ? 'BROKEN' : 'OK', "\n"; Expected result: ---------------- step 1. $ref is OK step 2. $ref is OK step 3. $ref is OK Actual result: -------------- step 1. $ref is OK step 2. $ref is OK step 3. $ref is BROKEN ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=51986&edit=1