Doc #77321 [Nab]: array_filter combined with references
| From: | cmb@php.net | Date: | Fri, 21 Dec 2018 09:27:08 +0000 |
| Subject: | Doc #77321 [Nab]: array_filter combined with references | ||
| References: | 1 | Groups: | php.doc.bugs |
| Request: | Send a blank email to doc-bugs+get-16228@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77321&edit=1
ID: 77321
Updated by: cmb@php.net
Reported by: php at kingsquare dot nl
Summary: array_filter combined with references
Status: Not a bug
Type: Documentation Problem
Package: Arrays related
PHP Version: 7.0.0
Block user comment: N
Private report: N
New Comment:
Ah, of course. Thanks!
Previous Comments:
------------------------------------------------------------------------
[2018-12-21 01:07:39] requinix@php.net
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];
}
------------------------------------------------------------------------
[2018-12-20 23:40:35] cmb@php.net
Shouldn't we trigger a notice/warning, if we ignore a call-by-ref
declaration?
------------------------------------------------------------------------
[2018-12-20 16:56:55] requinix@php.net
array_filter never supported by-ref values. The fact that it worked in PHP 5 was a bug, and it was
fixed in PHP 7 when much of the engine changed.
------------------------------------------------------------------------
[2018-12-20 09:06:12] 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]
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=77321&edit=1