This feature introduces list() support in foreach constructs:
<?php $users = array( array('Foo', 'Bar'), array('Baz', 'Qux'), ); // Before foreach ($users as $user) { list($firstName, $lastName) = $user; echo "First name: $firstName, last name: $lastName. "; } // After foreach ($users as list($firstName, $lastName)) { echo "First name: $firstName, last name: $lastName. "; }
This feature eliminates the use of a redundant variable ($user in the example above), reduces code verbosity in typical cases of iterating structured data, such as SQL result sets, and it doesn't introduce new keywords, but simply reuses a familiar PHP construct in a new context.
It's a commonly requested feature, and there is evidence that people already expect list() should work in this scenario: #10203 allow foreach($array as list($a,$b)
This RFC provides a behavior specification and implementation for this feature.
In order to avoid the reduce/reduce conflict, new bison rules will be added to the existing “foreach_variable”, to avoid this side effect:
<?php foreach (array(1,3,4) as &$key => $foo) { }
Without the new patch:
PHP Parse error: syntax error, unexpected '&', expecting T_STRING or T_VARIABLE or '$' in /home/huixc/test.php on line 2
With the new patch:
PHP Fatal error: Key element cannot be a reference in /home/huixc/test.php on line 2 Fatal error: Key element cannot be a reference in /home/huixc/test.php on line 2
It is possible to add support of the silent token in the new context:
$array = array(array(1,3,4), array(1, 2)); foreach ($array as @list($a, $b, $c)) { } 1