Bug #66256 [NoF->Wfx]: Generator::current() does not support return value by reference

From: Date: Tue, 14 Apr 2015 15:11:17 +0000
Subject: Bug #66256 [NoF->Wfx]: Generator::current() does not support return value by reference
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-192049@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=66256&edit=1

 ID:                 66256
 Updated by:         nikic@php.net
 Reported by:        edmond at inbox dot ru
 Summary:            Generator::current() does not support return value
                     by reference
-Status:             No Feedback
+Status:             Wont fix
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   Windows 7 64
 PHP Version:        5.5Git-2013-12-10 (snap)
 Assigned To:        nikic
 Block user comment: N
 Private report:     N



Previous Comments:
------------------------------------------------------------------------
[2015-04-14 15:11:01] nikic@php.net

Marking this as Won't Fix, as I don't this is a useful feature and it would add a
performance overhead for all usages. ArrayIterator, which is the only other iterator that supports
by-ref iteration in foreach (as far as I know), also has ::current() returning by-value.

------------------------------------------------------------------------
[2014-08-08 11:04:26] elliot at aanet dot com dot au

I assume this was never fixed.
Is there any known workaround?

------------------------------------------------------------------------
[2013-12-10 17:33:15] edmond at inbox dot ru

Description:
------------
Generator::current() does not support return value by reference.
I note foreach operator works fine with yield result which passed by reference.

The code below works normal:

function &my_test(&$array)
{
    foreach($array as $key => &$value)
    {
        yield $key => $value;
    }
}

$array = ['x1' => 1,'x2' => 2, 'x3' => 3,'x4' =>
4];

foreach(my_test($array) as $key => &$value)
{
    $value = $value + 10;
    echo "$key => $value\n";
}

print_r($array);

But when I use Generator::current() I get a different result.

On the other hand Generator::current() does not have to return value by reference. But there must be
another way to do it.


Test script:
---------------
function &my_test(&$array)
{
    foreach($array as $key => &$value)
    {
        yield $key => $value;
    }
}

$array          = ['x1' => 1,'x2' => 2, 'x3' =>
3,'x4' => 4];

$generator      = my_test($array);

while($generator->valid())
{
    $value      = $generator->current();
    $key        = $generator->key();

    $value      = $value + 10;

    echo "$key => $value\n";

    $generator->next();
}

print_r($array);

Expected result:
----------------
x1 => 11
x2 => 12
x3 => 13
x4 => 14
Array
(
    [x1] => 11
    [x2] => 12
    [x3] => 13
    [x4] => 14
)

Actual result:
--------------
x1 => 11
x2 => 12
x3 => 13
x4 => 14
Array
(
    [x1] => 1
    [x2] => 2
    [x3] => 3
    [x4] => 4
)


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=66256&edit=1


Thread (5 messages)

« previous php.bugs (#192049) next »