Take the State of PHP 2026 Survey →

foreach_variable supporting T_LIST View as Markdown

Implemented (PHP 5.5)
Authors
Xinchen Hui laruence@php.net
Date
2011-07-06
Version
1.0
Source
wiki.php.net/rfc/foreachlist

Votes

Should this RFC be merged into trunk? closed
Yes
11
No
4
15 voters
aharvey No 2012-08-20 01:44
derick Yes 2012-08-18 09:27
googleguy No 2012-08-21 17:07
hradtke Yes 2012-08-18 04:59
ircmaxell Yes 2012-08-18 12:17
kassner Yes 2012-08-19 16:10
kriscraig Yes 2012-08-19 07:07
laruence Yes 2012-08-25 12:30
levim Yes 2012-08-18 16:11
nikic Yes 2012-08-19 08:58
rdohms Yes 2012-08-22 12:42
seld Yes 2012-08-19 07:51
stas No 2012-08-19 04:30
willfitch No 2012-08-20 15:00
zhangzhenyu Yes 2012-08-24 10:07
Should this RFC(with supporting of silent token) be merged into trunk? closed
Yes
2
No
10
12 voters
aharvey No 2012-08-20 01:44
googleguy No 2012-08-21 17:07
ircmaxell No 2012-08-19 12:25
kassner No 2012-08-19 16:09
kriscraig Yes 2012-08-19 07:07
laruence Yes 2012-08-25 12:30
levim No 2012-08-20 13:49
nikic No 2012-08-19 08:58
rdohms No 2012-08-22 12:42
stas No 2012-08-19 07:47
willfitch No 2012-08-20 14:58
zhangzhenyu No 2012-08-24 10:07

Discussions on the mailing list

[RFC] foreach_variable supporting T_LIST token
by Xinchen Hui · 7 messages
[Patches]#36944, #54556, #55211(and svn karma applying)
by Laruence · 5 messages
[RFC] foreach_variable supporting T_LIST
by Laruence · 8 messages
[VOTE]Call for voting: support use list in foreach
by Laruence · 27 messages

RFC text

Copied from wiki.php.net, last synchronized Oct 13, 2026 11:52 UTC

Introduction

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.

Implementation details of the RFC

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

Possible additional features (vote separately): silent token

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

Patches

Vote

Vote: Should this RFC be merged into trunk? — Yes: 11 · No: 4 (closed)

Vote: Should this RFC(with supporting of silent token) be merged into trunk? — Yes: 2 · No: 10 (closed)

Changelog

  • 2011-07-06 Xinchen Hui: Initial RFC creation
  • 2011-07-06 Xinchen Hui: Updated patch
  • 2011-07-06 Xinchen Hui: Added tests phpt
  • 2011-07-07 Xinchen Hui: Added supporting for slience token(@)
  • 2011-07-07 Xinchen Hui: Updated sencode patch
  • 2011-07-08 Xinchen Hui: Added opcodes with silent token
  • 2011-07-24 Xinchen Hui: Updated patches that fixed a bug: znode->EA may be depend on an uninitialized value (thanks to Felipe)
  • 2012-07-18 Phidev: Rewrote the RFC
  • 2012-08-18 Xinchen Hui: Open voting
  • 2012-08-25 Xinchen Hui: Close voting