nicholsr Sun Jun 7 21:03:48 2009 UTC Added files: (Branch: PHP_5_3) /php-src/tests/lang foreachLoop.016.phpt foreachLoop.006.phpt foreachLoop.007.phpt foreachLoop.011.phpt foreachLoop.001.phpt foreachLoop.013.phpt foreachLoop.010.phpt foreachLoop.015.phpt foreachLoop.017.phpt foreachLoop.005.phpt foreachLoop.009.phpt foreachLoop.014.phpt foreachLoop.008.phpt foreachLoop.002.phpt foreachLoop.012.phpt foreachLoop.004.phpt foreachLoop.003.phpt Log: New tests for foreach loops. These were written by another member of the Projectzero team.
http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.016.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.016.phpt +++ php-src/tests/lang/foreachLoop.016.phpt --TEST-- Ensure foreach splits the iterated entity from its cow reference set, for all sorts of iterated entities. --FILE-- <?php error_reporting(E_ALL & ~E_STRICT);
echo "\n" . '$a' . "\n"; $b = $a = array('original'); foreach($a as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '${\'a\'}' . "\n"; $b = $a = array('original'); foreach(${'a'} as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$$a' . "\n"; $a = 'blah'; $$a = array('original'); $b = $$a; foreach($$a as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a[0]' . "\n"; $b = $a[0] = array('original'); foreach($a[0] as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a[0][0]' . "\n"; $b = $a[0][0] = array('original'); foreach($a[0][0] as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a->b' . "\n"; $b = $a->b = array('original'); foreach($a->b as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a->b->c' . "\n"; $b = $a->b->c = array('original'); foreach($a->b as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a->b[0]' . "\n"; $b = $a->b[0] = array('original'); foreach($a->b[0] as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a->b[0][0]' . "\n"; $b = $a->b[0][0] = array('original'); foreach($a->b[0][0] as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . '$a->b[0]->c' . "\n"; $b = $a->b[0]->c = array('original'); foreach($a->b[0]->c as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); class C { public static $a; } echo "\n" . 'C::$a' . "\n"; C::$a = array('original'); $b = C::$a; foreach(C::$a as $k=>&$v) { $v = 'changed'; } var_dump($b); unset($a, $b); echo "\n" . 'C::$a[0]' . "\n"; C::$a[0] = array('original'); $b = C::$a[0]; foreach(C::$a[0] as $k=>&$v) { $v = 'changed'; } var_dump($b); unset(C::$a[0], $b); echo "\n" . 'C::$a[0]->b' . "\n"; C::$a[0]->b = array('original'); $b = C::$a[0]->b; foreach(C::$a[0]->b as $k=>&$v) { $v = 'changed'; } var_dump($b); unset(C::$a[0]->b, $b); ?> --EXPECTF-- $a array(1) { [0]=> unicode(8) "original" } ${'a'} array(1) { [0]=> unicode(8) "original" } $$a array(1) { [0]=> unicode(8) "original" } $a[0] array(1) { [0]=> unicode(8) "original" } $a[0][0] array(1) { [0]=> unicode(8) "original" } $a->b array(1) { [0]=> unicode(8) "original" } $a->b->c array(1) { [0]=> unicode(8) "original" } $a->b[0] array(1) { [0]=> unicode(8) "original" } $a->b[0][0] array(1) { [0]=> unicode(8) "original" } $a->b[0]->c array(1) { [0]=> unicode(8) "original" } C::$a array(1) { [0]=> unicode(8) "original" } C::$a[0] array(1) { [0]=> unicode(8) "original" } C::$a[0]->b array(1) { [0]=> unicode(8) "original" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.006.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.006.phpt +++ php-src/tests/lang/foreachLoop.006.phpt --TEST-- Foreach loop tests - error case: key is a reference. --FILE-- <?php $a = array("a","b","c"); foreach ($a as &$k=>$v) { var_dump($v); } ?> --EXPECTF-- Fatal error: Key element cannot be a reference in %s on line 3 http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.007.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.007.phpt +++ php-src/tests/lang/foreachLoop.007.phpt --TEST-- Foreach loop tests - error case: reference to constant array. --FILE-- <?php echo "\nReference to constant array\n"; foreach (array(1,2) as &$v) { var_dump($v); } ?> --EXPECTF-- Parse error: %s on line 3 http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.011.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.011.phpt +++ php-src/tests/lang/foreachLoop.011.phpt --TEST-- Changing from an interable type to a non iterable type during the iteration --FILE-- <?php echo "\nChange from array to non iterable:\n"; $a = array(1,2,3); $b=&$a; foreach ($a as $v) { var_dump($v); $b=1; } echo "\nChange from object to non iterable:\n"; $a = new stdClass; $a->a=1; $a->b=2; $b=&$a; foreach ($a as $v) { var_dump($v); $b='x'; } ?> --EXPECTF-- Change from array to non iterable: int(1) Warning: Invalid argument supplied for foreach() in %s on line 5 Change from object to non iterable: int(1) Warning: Invalid argument supplied for foreach() in %s on line 15 http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.001.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.001.phpt +++ php-src/tests/lang/foreachLoop.001.phpt --TEST-- Foreach loop tests - basic loop with just value and key => value. --FILE-- <?php $a = array("a","b","c"); foreach ($a as $v) { var_dump($v); } foreach ($a as $k => $v) { var_dump($k, $v); } //check key and value after the loop. var_dump($k, $v); echo "\n"; //Dynamic array foreach (array("d","e","f") as $v) { var_dump($v); } foreach (array("d","e","f") as $k => $v) { var_dump($k, $v); } //check key and value after the loop. var_dump($k, $v); echo "\n"; //Ensure counter is advanced during loop $a=array("a","b","c"); foreach ($a as $v); var_dump(current($a)); $a=array("a","b","c"); foreach ($a as &$v); var_dump(current($a)); ?> --EXPECT-- unicode(1) "a" unicode(1) "b" unicode(1) "c" int(0) unicode(1) "a" int(1) unicode(1) "b" int(2) unicode(1) "c" int(2) unicode(1) "c" unicode(1) "d" unicode(1) "e" unicode(1) "f" int(0) unicode(1) "d" int(1) unicode(1) "e" int(2) unicode(1) "f" int(2) unicode(1) "f" bool(false) bool(false) http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.013.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.013.phpt +++ php-src/tests/lang/foreachLoop.013.phpt --TEST-- Directly modifying an unreferenced array when foreach'ing over it while using &$value syntax. --FILE-- <?php define('MAX_LOOPS',5); function withRefValue($elements, $transform) { echo "\n---( Array with $elements element(s): )---\n"; //Build array: for ($i=0; $i<$elements; $i++) { $a[] = "v.$i"; } $counter=0; echo "--> State of array before loop:\n"; var_dump($a); echo "--> Do loop:\n"; foreach ($a as $k=>&$v) { echo " iteration $counter: \$k=$k; \$v=$v\n"; eval($transform); $counter++; if ($counter>MAX_LOOPS) { echo " ** Stuck in a loop! **\n"; break; } } echo "--> State of array after loop:\n"; var_dump($a); } echo "\nPopping elements off end of an unreferenced array, using &\$value."; $transform = 'array_pop($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nShift elements off start of an unreferenced array, using &\$value."; $transform = 'array_shift($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nRemove current element of an unreferenced array, using &\$value."; $transform = 'unset($a[$k]);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the end of an unreferenced array, using &\$value."; $transform = 'array_push($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the start of an unreferenced array, using &\$value."; $transform = 'array_unshift($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); ?> --EXPECTF-- Popping elements off end of an unreferenced array, using &$value. ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(1) { [0]=> unicode(3) "v.0" } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=0; $v=v.0 iteration 3: $k=0; $v=v.0 --> State of array after loop: array(0) { } Shift elements off start of an unreferenced array, using &$value. ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 iteration 3: $k=0; $v=v.3 --> State of array after loop: array(0) { } Remove current element of an unreferenced array, using &$value. ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Adding elements to the end of an unreferenced array, using &$value. ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> &unicode(3) "v.0" [1]=> unicode(5) "new.0" } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=new.0 iteration 3: $k=3; $v=new.1 iteration 4: $k=4; $v=new.2 iteration 5: $k=5; $v=new.3 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(5) "new.0" [3]=> unicode(5) "new.1" [4]=> unicode(5) "new.2" [5]=> &unicode(5) "new.3" [6]=> unicode(5) "new.4" [7]=> unicode(5) "new.5" } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=new.0 iteration 4: $k=4; $v=new.1 iteration 5: $k=5; $v=new.2 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> &unicode(5) "new.2" [6]=> unicode(5) "new.3" [7]=> unicode(5) "new.4" [8]=> unicode(5) "new.5" } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 iteration 4: $k=4; $v=new.0 iteration 5: $k=5; $v=new.1 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" [4]=> unicode(5) "new.0" [5]=> &unicode(5) "new.1" [6]=> unicode(5) "new.2" [7]=> unicode(5) "new.3" [8]=> unicode(5) "new.4" [9]=> unicode(5) "new.5" } Adding elements to the start of an unreferenced array, using &$value. ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(5) "new.0" [1]=> &unicode(3) "v.0" } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" [9]=> unicode(3) "v.3" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.010.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.010.phpt +++ php-src/tests/lang/foreachLoop.010.phpt --TEST-- This test illustrates the impact of invoking destructors when refcount is decremented to 0 on foreach. It will pass only if the 'contentious code' in PHPValue.decReferences() is enabled. --FILE-- <?php $a = array(1,2,3); $container = array(&$a); // From php.net: // "Unless the array is referenced, foreach operates on a copy of // the specified array and not the array itself." // At this point, the array $a is referenced. // The following line ensures $a is no longer references as a consequence // of running the 'destructor' on $container. $container = null; // At this point the array $a is no longer referenced, so foreach should operate on a copy of the array. // However, P8 does not invoke 'destructors' when refcount is decremented to 0. // Consequently, $a thinks it is still referenced, and foreach will operate on the array itself. // This provokes a difference in behaviour when changing the number of elements in the array while // iterating over it. $i=0; foreach ($a as $v) { array_push($a, 'new'); var_dump($v); if (++$i>10) { echo "Infinite loop detected\n"; break; } } ?> --EXPECTF-- int(1) int(2) int(3) http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.015.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.015.phpt +++ php-src/tests/lang/foreachLoop.015.phpt --TEST-- Directly modifying a REFERENCED array when foreach'ing over it while using &$value syntax. --FILE-- <?php define('MAX_LOOPS',5); function withRefValue($elements, $transform) { echo "\n---( Array with $elements element(s): )---\n"; //Build array: for ($i=0; $i<$elements; $i++) { $a[] = "v.$i"; } $counter=0; $ref = &$a; echo "--> State of referenced array before loop:\n"; var_dump($a); echo "--> Do loop:\n"; foreach ($a as $k=>&$v) { echo " iteration $counter: \$k=$k; \$v=$v\n"; eval($transform); $counter++; if ($counter>MAX_LOOPS) { echo " ** Stuck in a loop! **\n"; break; } } echo "--> State of array after loop:\n"; var_dump($a); } echo "\nPopping elements off end of a referenced array, using &\$value"; $transform = 'array_pop($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nShift elements off start of a referenced array, using &\$value"; $transform = 'array_shift($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nRemove current element of a referenced array, using &\$value"; $transform = 'unset($a[$k]);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the end of a referenced array, using &\$value"; $transform = 'array_push($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the start of a referenced array, using &\$value"; $transform = 'array_unshift($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); ?> --EXPECTF-- Popping elements off end of a referenced array, using &$value ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(1) { [0]=> unicode(3) "v.0" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=0; $v=v.0 iteration 3: $k=0; $v=v.0 --> State of array after loop: array(0) { } Shift elements off start of a referenced array, using &$value ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 iteration 3: $k=0; $v=v.3 --> State of array after loop: array(0) { } Remove current element of a referenced array, using &$value ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Adding elements to the end of a referenced array, using &$value ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> &unicode(3) "v.0" [1]=> unicode(5) "new.0" } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=new.0 iteration 3: $k=3; $v=new.1 iteration 4: $k=4; $v=new.2 iteration 5: $k=5; $v=new.3 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(5) "new.0" [3]=> unicode(5) "new.1" [4]=> unicode(5) "new.2" [5]=> &unicode(5) "new.3" [6]=> unicode(5) "new.4" [7]=> unicode(5) "new.5" } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=new.0 iteration 4: $k=4; $v=new.1 iteration 5: $k=5; $v=new.2 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> &unicode(5) "new.2" [6]=> unicode(5) "new.3" [7]=> unicode(5) "new.4" [8]=> unicode(5) "new.5" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 iteration 4: $k=4; $v=new.0 iteration 5: $k=5; $v=new.1 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" [4]=> unicode(5) "new.0" [5]=> &unicode(5) "new.1" [6]=> unicode(5) "new.2" [7]=> unicode(5) "new.3" [8]=> unicode(5) "new.4" [9]=> unicode(5) "new.5" } Adding elements to the start of a referenced array, using &$value ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(5) "new.0" [1]=> &unicode(3) "v.0" } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(5) "new.5" [1]=> &unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" [9]=> unicode(3) "v.3" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.017.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.017.phpt +++ php-src/tests/lang/foreachLoop.017.phpt --TEST-- Ensure foreach works with arrays with Binary keys. --FILE-- <?php $a = array ( "\x90" => 10 ); foreach ($a as $val=>$key) echo $key; echo "\nDone\n"; ?> --EXPECTF-- 10 Done http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.005.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.005.phpt +++ php-src/tests/lang/foreachLoop.005.phpt --TEST-- Foreach loop tests - modifying the array during the loop: special case. Behaviour is good since php 5.2.2. --FILE-- <?php $a = array("original.0","original.1","original.2"); foreach ($a as $k=>&$v){ $a[$k] = "changed.$k"; echo "After changing \$a directly, \...@$k is: $v\n"; } //--- Expected output: //After changing $a directly, $...@0 is: changed.0 //After changing $a directly, $...@1 is: changed.1 //After changing $a directly, $...@2 is: changed.2 //--- Actual output from php.net before 5.2.2: //After changing $a directly, $...@0 is: changed.0 //After changing $a directly, $...@1 is: original.1 //After changing $a directly, $...@2 is: original.2 ?> --EXPECT-- After changing $a directly, $...@0 is: changed.0 After changing $a directly, $...@1 is: changed.1 After changing $a directly, $...@2 is: changed.2 http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.009.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.009.phpt +++ php-src/tests/lang/foreachLoop.009.phpt --TEST-- Foreach loop tests - foreach operates on the original array if the array is referenced outside the loop. --FILE-- <?php // From php.net/foreach: // "Unless the array is referenced, foreach operates on a copy of the specified array." echo "\nRemove elements from a referenced array during loop\n"; $refedArray=array("original.0", "original.1", "original.2"); $ref=&$refedArray; foreach ($refedArray as $k=>$v1) { array_pop($refedArray); echo "key: $k; value: $v1\n"; } echo "\nRemove elements from a referenced array during loop, using &\$value\n"; $refedArray=array("original.0", "original.1", "original.2"); $ref=&$refedArray; foreach ($refedArray as $k=>&$v2) { array_pop($refedArray); echo "key: $k; value: $v2\n"; } echo "\nAdd elements to a referenced array during loop\n"; $refedArray=array("original.0", "original.1", "original.2"); $ref=&$refedArray; $count=0; foreach ($refedArray as $k=>$v3) { array_push($refedArray, "new.$k"); echo "key: $k; value: $v3\n"; if ($count++>5) { echo "Loop detected, as expected.\n"; break; } } echo "\nAdd elements to a referenced array during loop, using &\$value\n"; $refedArray=array("original.0", "original.1", "original.2"); $ref=&$refedArray; $count=0; foreach ($refedArray as $k=>&$v4) { array_push($refedArray, "new.$k"); echo "key: $k; value: $v4\n"; if ($count++>5) { echo "Loop detected, as expected.\n"; break; } } ?> --EXPECT-- Remove elements from a referenced array during loop key: 0; value: original.0 key: 1; value: original.1 Remove elements from a referenced array during loop, using &$value key: 0; value: original.0 key: 1; value: original.1 Add elements to a referenced array during loop key: 0; value: original.0 key: 1; value: original.1 key: 2; value: original.2 key: 3; value: new.0 key: 4; value: new.1 key: 5; value: new.2 key: 6; value: new.3 Loop detected, as expected. Add elements to a referenced array during loop, using &$value key: 0; value: original.0 key: 1; value: original.1 key: 2; value: original.2 key: 3; value: new.0 key: 4; value: new.1 key: 5; value: new.2 key: 6; value: new.3 Loop detected, as expected. http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.014.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.014.phpt +++ php-src/tests/lang/foreachLoop.014.phpt --TEST-- Directly modifying a REFERENCED array when foreach'ing over it. --FILE-- <?php define('MAX_LOOPS',5); function withRefValue($elements, $transform) { echo "\n---( Array with $elements element(s): )---\n"; //Build array: for ($i=0; $i<$elements; $i++) { $a[] = "v.$i"; } $counter=0; $ref = &$a; echo "--> State of referenced array before loop:\n"; var_dump($a); echo "--> Do loop:\n"; foreach ($a as $k=>$v) { echo " iteration $counter: \$k=$k; \$v=$v\n"; eval($transform); $counter++; if ($counter>MAX_LOOPS) { echo " ** Stuck in a loop! **\n"; break; } } echo "--> State of array after loop:\n"; var_dump($a); } echo "\nPopping elements off end of a referenced array"; $transform = 'array_pop($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nShift elements off start of a referenced array"; $transform = 'array_shift($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nRemove current element of a referenced array"; $transform = 'unset($a[$k]);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the end of a referenced array"; $transform = 'array_push($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the start of a referenced array"; $transform = 'array_unshift($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); ?> --EXPECTF-- Popping elements off end of a referenced array ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(1) { [0]=> unicode(3) "v.0" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=0; $v=v.0 iteration 3: $k=0; $v=v.0 --> State of array after loop: array(0) { } Shift elements off start of a referenced array ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=v.1 iteration 2: $k=0; $v=v.2 iteration 3: $k=0; $v=v.3 --> State of array after loop: array(0) { } Remove current element of a referenced array ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Adding elements to the end of a referenced array ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(5) "new.0" } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=new.0 iteration 3: $k=3; $v=new.1 iteration 4: $k=4; $v=new.2 iteration 5: $k=5; $v=new.3 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(5) "new.0" [3]=> unicode(5) "new.1" [4]=> unicode(5) "new.2" [5]=> unicode(5) "new.3" [6]=> unicode(5) "new.4" [7]=> unicode(5) "new.5" } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=new.0 iteration 4: $k=4; $v=new.1 iteration 5: $k=5; $v=new.2 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.2" [6]=> unicode(5) "new.3" [7]=> unicode(5) "new.4" [8]=> unicode(5) "new.5" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 iteration 4: $k=4; $v=new.0 iteration 5: $k=5; $v=new.1 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" [4]=> unicode(5) "new.0" [5]=> unicode(5) "new.1" [6]=> unicode(5) "new.2" [7]=> unicode(5) "new.3" [8]=> unicode(5) "new.4" [9]=> unicode(5) "new.5" } Adding elements to the start of a referenced array ---( Array with 1 element(s): )--- --> State of referenced array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(5) "new.0" [1]=> unicode(3) "v.0" } ---( Array with 2 element(s): )--- --> State of referenced array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(8) { [0]=> unicode(5) "new.5" [1]=> unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" } ---( Array with 3 element(s): )--- --> State of referenced array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(9) { [0]=> unicode(5) "new.5" [1]=> unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" } ---( Array with 4 element(s): )--- --> State of referenced array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=0; $v=new.0 iteration 2: $k=0; $v=new.1 iteration 3: $k=0; $v=new.2 iteration 4: $k=0; $v=new.3 iteration 5: $k=0; $v=new.4 ** Stuck in a loop! ** --> State of array after loop: array(10) { [0]=> unicode(5) "new.5" [1]=> unicode(5) "new.4" [2]=> unicode(5) "new.3" [3]=> unicode(5) "new.2" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.0" [6]=> unicode(3) "v.0" [7]=> unicode(3) "v.1" [8]=> unicode(3) "v.2" [9]=> unicode(3) "v.3" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.008.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.008.phpt +++ php-src/tests/lang/foreachLoop.008.phpt --TEST-- Foreach loop tests - error case: reference to constant array, with key. --FILE-- <?php foreach (array(1,2) as $k=>&$v) { var_dump($v); } ?> --EXPECTF-- Fatal error: Cannot create references to elements of a temporary array expression in %s on line 2 http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.002.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.002.phpt +++ php-src/tests/lang/foreachLoop.002.phpt --TEST-- Foreach loop tests - modifying the array during the loop. --FILE-- <?php echo "\nDirectly changing array values.\n"; $a = array("original.1","original.2","original.3"); foreach ($a as $k=>$v) { $a[$k]="changed.$k"; var_dump($v); } var_dump($a); echo "\nModifying the foreach \$value.\n"; $a = array("original.1","original.2","original.3"); foreach ($a as $k=>$v) { $v="changed.$k"; } var_dump($a); echo "\nModifying the foreach &\$value.\n"; $a = array("original.1","original.2","original.3"); foreach ($a as $k=>&$v) { $v="changed.$k"; } var_dump($a); echo "\nPushing elements onto an unreferenced array.\n"; $a = array("original.1","original.2","original.3"); $counter=0; foreach ($a as $v) { array_push($a, "new.$counter"); //avoid infinite loop if test is failing if ($counter++>10) { echo "Loop detected\n"; break; } } var_dump($a); echo "\nPushing elements onto an unreferenced array, using &\$value.\n"; $a = array("original.1","original.2","original.3"); $counter=0; foreach ($a as &$v) { array_push($a, "new.$counter"); //avoid infinite loop if test is failing if ($counter++>10) { echo "Loop detected\n"; break; } } var_dump($a); echo "\nPopping elements off an unreferenced array.\n"; $a = array("original.1","original.2","original.3"); foreach ($a as $v) { array_pop($a); var_dump($v); } var_dump($a); echo "\nPopping elements off an unreferenced array, using &\$value.\n"; $a = array("original.1","original.2","original.3"); foreach ($a as &$v) { array_pop($a); var_dump($v); } var_dump($a); ?> --EXPECT-- Directly changing array values. unicode(10) "original.1" unicode(10) "original.2" unicode(10) "original.3" array(3) { [0]=> unicode(9) "changed.0" [1]=> unicode(9) "changed.1" [2]=> unicode(9) "changed.2" } Modifying the foreach $value. array(3) { [0]=> unicode(10) "original.1" [1]=> unicode(10) "original.2" [2]=> unicode(10) "original.3" } Modifying the foreach &$value. array(3) { [0]=> unicode(9) "changed.0" [1]=> unicode(9) "changed.1" [2]=> &unicode(9) "changed.2" } Pushing elements onto an unreferenced array. array(6) { [0]=> unicode(10) "original.1" [1]=> unicode(10) "original.2" [2]=> unicode(10) "original.3" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.2" } Pushing elements onto an unreferenced array, using &$value. Loop detected array(15) { [0]=> unicode(10) "original.1" [1]=> unicode(10) "original.2" [2]=> unicode(10) "original.3" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.2" [6]=> unicode(5) "new.3" [7]=> unicode(5) "new.4" [8]=> unicode(5) "new.5" [9]=> unicode(5) "new.6" [10]=> unicode(5) "new.7" [11]=> &unicode(5) "new.8" [12]=> unicode(5) "new.9" [13]=> unicode(6) "new.10" [14]=> unicode(6) "new.11" } Popping elements off an unreferenced array. unicode(10) "original.1" unicode(10) "original.2" unicode(10) "original.3" array(0) { } Popping elements off an unreferenced array, using &$value. unicode(10) "original.1" unicode(10) "original.2" array(1) { [0]=> unicode(10) "original.1" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.012.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.012.phpt +++ php-src/tests/lang/foreachLoop.012.phpt --TEST-- Directly modifying an unreferenced array when foreach'ing over it. --FILE-- <?php define('MAX_LOOPS',5); function withRefValue($elements, $transform) { echo "\n---( Array with $elements element(s): )---\n"; //Build array: for ($i=0; $i<$elements; $i++) { $a[] = "v.$i"; } $counter=0; echo "--> State of array before loop:\n"; var_dump($a); echo "--> Do loop:\n"; foreach ($a as $k=>$v) { echo " iteration $counter: \$k=$k; \$v=$v\n"; eval($transform); $counter++; if ($counter>MAX_LOOPS) { echo " ** Stuck in a loop! **\n"; break; } } echo "--> State of array after loop:\n"; var_dump($a); } echo "\nPopping elements off end of an unreferenced array"; $transform = 'array_pop($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nShift elements off start of an unreferenced array"; $transform = 'array_shift($a);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nRemove current element of an unreferenced array"; $transform = 'unset($a[$k]);'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the end of an unreferenced array"; $transform = 'array_push($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); echo "\n\n\nAdding elements to the start of an unreferenced array"; $transform = 'array_unshift($a, "new.$counter");'; withRefValue(1, $transform); withRefValue(2, $transform); withRefValue(3, $transform); withRefValue(4, $transform); ?> --EXPECTF-- Popping elements off end of an unreferenced array ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Shift elements off start of an unreferenced array ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Remove current element of an unreferenced array ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(0) { } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(0) { } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(0) { } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(0) { } Adding elements to the end of an unreferenced array ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(5) "new.0" } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(5) "new.0" [3]=> unicode(5) "new.1" } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(6) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(5) "new.0" [4]=> unicode(5) "new.1" [5]=> unicode(5) "new.2" } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(8) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" [4]=> unicode(5) "new.0" [5]=> unicode(5) "new.1" [6]=> unicode(5) "new.2" [7]=> unicode(5) "new.3" } Adding elements to the start of an unreferenced array ---( Array with 1 element(s): )--- --> State of array before loop: array(1) { [0]=> unicode(3) "v.0" } --> Do loop: iteration 0: $k=0; $v=v.0 --> State of array after loop: array(2) { [0]=> unicode(5) "new.0" [1]=> unicode(3) "v.0" } ---( Array with 2 element(s): )--- --> State of array before loop: array(2) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 --> State of array after loop: array(4) { [0]=> unicode(5) "new.1" [1]=> unicode(5) "new.0" [2]=> unicode(3) "v.0" [3]=> unicode(3) "v.1" } ---( Array with 3 element(s): )--- --> State of array before loop: array(3) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 --> State of array after loop: array(6) { [0]=> unicode(5) "new.2" [1]=> unicode(5) "new.1" [2]=> unicode(5) "new.0" [3]=> unicode(3) "v.0" [4]=> unicode(3) "v.1" [5]=> unicode(3) "v.2" } ---( Array with 4 element(s): )--- --> State of array before loop: array(4) { [0]=> unicode(3) "v.0" [1]=> unicode(3) "v.1" [2]=> unicode(3) "v.2" [3]=> unicode(3) "v.3" } --> Do loop: iteration 0: $k=0; $v=v.0 iteration 1: $k=1; $v=v.1 iteration 2: $k=2; $v=v.2 iteration 3: $k=3; $v=v.3 --> State of array after loop: array(8) { [0]=> unicode(5) "new.3" [1]=> unicode(5) "new.2" [2]=> unicode(5) "new.1" [3]=> unicode(5) "new.0" [4]=> unicode(3) "v.0" [5]=> unicode(3) "v.1" [6]=> unicode(3) "v.2" [7]=> unicode(3) "v.3" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.004.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.004.phpt +++ php-src/tests/lang/foreachLoop.004.phpt --TEST-- Foreach loop tests - using an array element as the $value --FILE-- <?php $a=array("a", "b", "c"); $v=array(); foreach($a as $v[0]) { var_dump($v); } var_dump($a); var_dump($v); echo "\n"; $a=array("a", "b", "c"); $v=array(); foreach($a as $k=>$v[0]) { var_dump($k, $v); } var_dump($a); var_dump($k, $v); ?> --EXPECT-- array(1) { [0]=> unicode(1) "a" } array(1) { [0]=> unicode(1) "b" } array(1) { [0]=> unicode(1) "c" } array(3) { [0]=> unicode(1) "a" [1]=> unicode(1) "b" [2]=> unicode(1) "c" } array(1) { [0]=> unicode(1) "c" } int(0) array(1) { [0]=> unicode(1) "a" } int(1) array(1) { [0]=> unicode(1) "b" } int(2) array(1) { [0]=> unicode(1) "c" } array(3) { [0]=> unicode(1) "a" [1]=> unicode(1) "b" [2]=> unicode(1) "c" } int(2) array(1) { [0]=> unicode(1) "c" } http://cvs.php.net/viewvc.cgi/php-src/tests/lang/foreachLoop.003.phpt?view=markup&rev=1.1 Index: php-src/tests/lang/foreachLoop.003.phpt +++ php-src/tests/lang/foreachLoop.003.phpt --TEST-- Foreach loop tests - error case: not an array. --FILE-- <?php echo "\nNot an array.\n"; $a = TRUE; foreach ($a as $v) { var_dump($v); } $a = null; foreach ($a as $v) { var_dump($v); } $a = 1; foreach ($a as $v) { var_dump($v); } $a = 1.5; foreach ($a as $v) { var_dump($v); } $a = "hello"; foreach ($a as $v) { var_dump($v); } echo "done.\n"; ?> --EXPECTF-- Not an array. Warning: Invalid argument supplied for foreach() in %s on line 4 Warning: Invalid argument supplied for foreach() in %s on line 9 Warning: Invalid argument supplied for foreach() in %s on line 14 Warning: Invalid argument supplied for foreach() in %s on line 19 Warning: Invalid argument supplied for foreach() in %s on line 24 done.
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php