|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2018-12-20 09:06 UTC] php at kingsquare dot nl
Description: ------------ This is probably on purpose, but there is an undocumented backwards compatibility issue betwee PHP5 and PHP7. I know this might be a bit late to the party, but still. It involves the differnce in using array_filter and references. Test script: --------------- <?php // also see https://3v4l.org/Z2HnL $input = [1, 2]; var_dump(array_filter($input, function(& $value) { if ($value % 2 === 0) { return false; } $value++; return true; })); Expected result: ---------------- As the changelog doesn't seem to mention anything related to this I would expect them to be the same result [(int)2]. Actual result: -------------- PHP5: [2] PHP7: [1] PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 22:00:01 2025 UTC |
I don't think there should be. As far as I know the callback is being called with a reference correctly, however for $input to get the change, it (being the first argument to array_filter) would have to be a reference too. Just like with a userland implementation, the by-ref $value is working, but since $input isn't a reference the change is happening on a copy. So no warning. Also like a userland implementation, you can trick the engine by making $input's items references to something else. $input is still a copy but changing $value will work. Like $source = [1, 2]; $input = [&$source[0], &$source[1]]; or foreach ($source as $key => $value) { $input[$key] =& $source[$key]; }