New foreach tests. Tested on Windows, Linux and Linux 64 bit.

This commit is contained in:
andy wharmby 2009-06-14 14:17:43 +00:00
parent ceca4f3615
commit 1888c718cb
6 changed files with 1186 additions and 0 deletions

View File

@ -0,0 +1,69 @@
--TEST--
Foreach loop on objects - basic loop with just value and key => value.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
protected $d = "Original d";
private $e = "Original e";
}
echo "\n\nSimple loop.\n";
$obj = new C;
foreach ($obj as $v) {
var_dump($v);
}
foreach ($obj as $k => $v) {
var_dump($k, $v);
}
echo "\nCheck key and value after the loop.\n";
var_dump($k, $v);
echo "\n\nObject instantiated inside loop.\n";
foreach (new C as $v) {
var_dump($v);
}
foreach (new C as $k => $v) {
var_dump($k, $v);
}
echo "\nCheck key and value after the loop.\n";
var_dump($k, $v);
?>
--EXPECTF--
Simple loop.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(1) "a"
string(10) "Original a"
string(1) "b"
string(10) "Original b"
string(1) "c"
string(10) "Original c"
Check key and value after the loop.
string(1) "c"
string(10) "Original c"
Object instantiated inside loop.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(1) "a"
string(10) "Original a"
string(1) "b"
string(10) "Original b"
string(1) "c"
string(10) "Original c"
Check key and value after the loop.
string(1) "c"
string(10) "Original c"

View File

@ -0,0 +1,587 @@
--TEST--
Foreach loop tests - visibility.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
protected $d = "Original d";
private $e = "Original e";
function doForEachC() {
echo "in C::doForEachC\n";
foreach ($this as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
static function doForEach($obj) {
echo "in C::doForEach\n";
foreach ($obj as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
function doForEachOnThis() {
echo "in C::doForEachOnThis\n";
foreach ($this as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
}
class D extends C {
private $f = "Original f";
protected $g = "Original g";
static function doForEach($obj) {
echo "in D::doForEach\n";
foreach ($obj as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
function doForEachOnThis() {
echo "in D::doForEachOnThis\n";
foreach ($this as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
}
class E extends D {
public $a = "Overridden a";
public $b = "Overridden b";
public $c = "Overridden c";
protected $d = "Overridden d";
private $e = "Overridden e";
static function doForEach($obj) {
echo "in E::doForEach\n";
foreach ($obj as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
function doForEachOnThis() {
echo "in E::doForEachOnThis\n";
foreach ($this as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
}
}
echo "\n\nIterate over various generations from within overridden methods:\n";
echo "\n--> Using instance of C:\n";
$myC = new C;
$myC->doForEachOnThis();
var_dump($myC);
echo "\n--> Using instance of D:\n";
$myD = new D;
$myD->doForEachOnThis();
var_dump($myD);
echo "\n--> Using instance of E:\n";
$myE = new E;
$myE->doForEachOnThis();
var_dump($myE);
echo "\n\nIterate over various generations from within an inherited method:\n";
echo "\n--> Using instance of C:\n";
$myC = new C;
$myC->doForEachC();
var_dump($myC);
echo "\n--> Using instance of D:\n";
$myD = new D;
$myD->doForEachC();
var_dump($myD);
echo "\n--> Using instance of E:\n";
$myE = new E;
$myE->doForEachC();
var_dump($myE);
echo "\n\nIterate over various generations from within an overridden static method:\n";
echo "\n--> Using instance of C:\n";
$myC = new C;
C::doForEach($myC);
var_dump($myC);
$myC = new C;
D::doForEach($myC);
var_dump($myC);
$myC = new C;
E::doForEach($myC);
var_dump($myC);
echo "\n--> Using instance of D:\n";
$myD = new D;
C::doForEach($myD);
var_dump($myD);
$myD = new D;
D::doForEach($myD);
var_dump($myD);
$myD = new D;
E::doForEach($myD);
var_dump($myD);
echo "\n--> Using instance of E:\n";
$myE = new E;
C::doForEach($myE);
var_dump($myE);
$myE = new E;
D::doForEach($myE);
var_dump($myE);
$myE = new E;
E::doForEach($myE);
var_dump($myE);
echo "\n\nIterate over various generations from outside the object:\n";
echo "\n--> Using instance of C:\n";
$myC = new C;
foreach ($myC as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
var_dump($myC);
echo "\n--> Using instance of D:\n";
$myD = new D;
foreach ($myD as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
var_dump($myD);
echo "\n--> Using instance of E:\n";
$myE = new E;
foreach ($myE as $k=>&$v) {
var_dump($v);
$v="changed.$k";
}
var_dump($myE);
?>
===DONE===
--EXPECTF--
Iterate over various generations from within overridden methods:
--> Using instance of C:
in C::doForEachOnThis
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
}
--> Using instance of D:
in D::doForEachOnThis
string(10) "Original f"
string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
object(D)#%d (7) {
["f":"D":private]=>
string(9) "changed.f"
["g":protected]=>
string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
}
--> Using instance of E:
in E::doForEachOnThis
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
string(12) "Overridden e"
string(10) "Original g"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"E":private]=>
string(9) "changed.e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["e":"C":private]=>
string(10) "Original e"
}
Iterate over various generations from within an inherited method:
--> Using instance of C:
in C::doForEachC
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
}
--> Using instance of D:
in C::doForEachC
string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(D)#%d (7) {
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
}
--> Using instance of E:
in C::doForEachC
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
string(10) "Original g"
string(10) "Original e"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"E":private]=>
string(12) "Overridden e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["e":"C":private]=>
string(9) "changed.e"
}
Iterate over various generations from within an overridden static method:
--> Using instance of C:
in C::doForEach
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
}
in D::doForEach
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
}
in E::doForEach
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
}
--> Using instance of D:
in C::doForEach
string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(D)#%d (7) {
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(9) "changed.e"
}
in D::doForEach
string(10) "Original f"
string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
object(D)#%d (7) {
["f":"D":private]=>
string(9) "changed.f"
["g":protected]=>
string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
}
in E::doForEach
string(10) "Original g"
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
object(D)#%d (7) {
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"C":private]=>
string(10) "Original e"
}
--> Using instance of E:
in C::doForEach
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
string(10) "Original g"
string(10) "Original e"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"E":private]=>
string(12) "Overridden e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["e":"C":private]=>
string(9) "changed.e"
}
in D::doForEach
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
string(10) "Original f"
string(10) "Original g"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"E":private]=>
string(12) "Overridden e"
["f":"D":private]=>
string(9) "changed.f"
["g":protected]=>
string(9) "changed.g"
["e":"C":private]=>
string(10) "Original e"
}
in E::doForEach
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
string(12) "Overridden d"
string(12) "Overridden e"
string(10) "Original g"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(9) "changed.d"
["e":"E":private]=>
string(9) "changed.e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(9) "changed.g"
["e":"C":private]=>
string(10) "Original e"
}
Iterate over various generations from outside the object:
--> Using instance of C:
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
&string(9) "changed.c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
--> Using instance of D:
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
object(D)#%d (7) {
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(10) "Original g"
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
&string(9) "changed.c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
--> Using instance of E:
string(12) "Overridden a"
string(12) "Overridden b"
string(12) "Overridden c"
object(E)#%d (8) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
&string(9) "changed.c"
["d":protected]=>
string(12) "Overridden d"
["e":"E":private]=>
string(12) "Overridden e"
["f":"D":private]=>
string(10) "Original f"
["g":protected]=>
string(10) "Original g"
["e":"C":private]=>
string(10) "Original e"
}
===DONE===

View File

@ -0,0 +1,250 @@
--TEST--
Foreach loop tests - modifying the object during the loop.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
protected $d = "Original d";
private $e = "Original e";
}
echo "\nDirectly changing object values.\n";
$obj = new C;
foreach ($obj as $k=>$v) {
$obj->$k="changed.$k";
var_dump($v);
}
var_dump($obj);
echo "\nModifying the foreach \$value.\n";
$obj = new C;
foreach ($obj as $k=>$v) {
$v="changed.$k";
}
var_dump($obj);
echo "\nModifying the foreach &\$value.\n";
$obj = new C;
foreach ($obj as $k=>&$v) {
$v="changed.$k";
}
var_dump($obj);
echo "\nAdding properties to an an object.\n";
$obj = new C;
$counter=0;
foreach ($obj as $v) {
$newPropName = "new$counter";
$obj->$newPropName = "Added property $counter";
if ($counter++>10) {
echo "Loop detected\n";
break;
}
var_dump($v);
}
var_dump($obj);
echo "\nAdding properties to an an object, using &\$value.\n";
$obj = new C;
$counter=0;
foreach ($obj as &$v) {
$newPropName = "new$counter";
$obj->$newPropName = "Added property $counter";
if ($counter++>10) {
echo "Loop detected\n";
break;
}
var_dump($v);
}
var_dump($obj);
echo "\nRemoving properties from an object.\n";
$obj = new C;
foreach ($obj as $v) {
unset($obj->a);
unset($obj->b);
unset($obj->c);
var_dump($v);
}
var_dump($obj);
echo "\nRemoving properties from an object, using &\$value.\n";
$obj = new C;
foreach ($obj as &$v) {
unset($obj->a);
unset($obj->b);
unset($obj->c);
var_dump($v);
}
var_dump($obj);
?>
===DONE===
--EXPECTF--
Directly changing object values.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
string(9) "changed.c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
Modifying the foreach $value.
object(C)#%d (5) {
["a"]=>
string(10) "Original a"
["b"]=>
string(10) "Original b"
["c"]=>
string(10) "Original c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
Modifying the foreach &$value.
object(C)#%d (5) {
["a"]=>
string(9) "changed.a"
["b"]=>
string(9) "changed.b"
["c"]=>
&string(9) "changed.c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
Adding properties to an an object.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(16) "Added property 0"
string(16) "Added property 1"
string(16) "Added property 2"
string(16) "Added property 3"
string(16) "Added property 4"
string(16) "Added property 5"
string(16) "Added property 6"
string(16) "Added property 7"
Loop detected
object(C)#%d (17) {
["a"]=>
string(10) "Original a"
["b"]=>
string(10) "Original b"
["c"]=>
string(10) "Original c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
["new0"]=>
string(16) "Added property 0"
["new1"]=>
string(16) "Added property 1"
["new2"]=>
string(16) "Added property 2"
["new3"]=>
string(16) "Added property 3"
["new4"]=>
string(16) "Added property 4"
["new5"]=>
string(16) "Added property 5"
["new6"]=>
string(16) "Added property 6"
["new7"]=>
string(16) "Added property 7"
["new8"]=>
string(16) "Added property 8"
["new9"]=>
string(16) "Added property 9"
["new10"]=>
string(17) "Added property 10"
["new11"]=>
string(17) "Added property 11"
}
Adding properties to an an object, using &$value.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(16) "Added property 0"
string(16) "Added property 1"
string(16) "Added property 2"
string(16) "Added property 3"
string(16) "Added property 4"
string(16) "Added property 5"
string(16) "Added property 6"
string(16) "Added property 7"
Loop detected
object(C)#%d (17) {
["a"]=>
string(10) "Original a"
["b"]=>
string(10) "Original b"
["c"]=>
string(10) "Original c"
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
["new0"]=>
string(16) "Added property 0"
["new1"]=>
string(16) "Added property 1"
["new2"]=>
string(16) "Added property 2"
["new3"]=>
string(16) "Added property 3"
["new4"]=>
string(16) "Added property 4"
["new5"]=>
string(16) "Added property 5"
["new6"]=>
string(16) "Added property 6"
["new7"]=>
string(16) "Added property 7"
["new8"]=>
&string(16) "Added property 8"
["new9"]=>
string(16) "Added property 9"
["new10"]=>
string(17) "Added property 10"
["new11"]=>
string(17) "Added property 11"
}
Removing properties from an object.
string(10) "Original a"
object(C)#%d (2) {
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
Removing properties from an object, using &$value.
string(10) "Original a"
object(C)#%d (2) {
["d":protected]=>
string(10) "Original d"
["e":"C":private]=>
string(10) "Original e"
}
===DONE===

View File

@ -0,0 +1,55 @@
--TEST--
Foreach loop tests - Removing the current element from an iterated object.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
public $d = "Original d";
public $e = "Original e";
}
echo "\nRemoving the current element from an iterated object.\n";
$obj = new C;
$count=0;
foreach ($obj as $v) {
if ($v==$obj->b) {
unset($obj->b);
}
var_dump($v);
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
?>
===DONE===
--EXPECTF--
Removing the current element from an iterated object.
string(10) "Original a"
string(10) "Original b"
Notice: Undefined property: C::$b in %s on line %d
string(10) "Original c"
Notice: Undefined property: C::$b in %s on line %d
string(10) "Original d"
Notice: Undefined property: C::$b in %s on line %d
string(10) "Original e"
object(C)#%d (4) {
["a"]=>
string(10) "Original a"
["c"]=>
string(10) "Original c"
["d"]=>
string(10) "Original d"
["e"]=>
string(10) "Original e"
}
===DONE===

View File

@ -0,0 +1,78 @@
--TEST--
Foreach loop tests - removing properties before and after the current property during the loop.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
public $d = "Original d";
public $e = "Original e";
}
echo "\nRemoving properties before the current element from an iterated object.\n";
$obj = new C;
$count=0;
foreach ($obj as $v) {
if ($v==$obj->a) {
unset($obj->c);
}
var_dump($v);
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
echo "\nRemoving properties before the current element from an iterated object.\n";
$obj = new C;
foreach ($obj as $v) {
if ($v==$obj->b) {
unset($obj->a);
}
var_dump($v);
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
?>
--EXPECTF--
Removing properties before the current element from an iterated object.
string(10) "Original a"
string(10) "Original b"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (4) {
["a"]=>
string(10) "Original a"
["b"]=>
string(10) "Original b"
["d"]=>
string(10) "Original d"
["e"]=>
string(10) "Original e"
}
Removing properties before the current element from an iterated object.
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (4) {
["b"]=>
string(10) "Original b"
["c"]=>
string(10) "Original c"
["d"]=>
string(10) "Original d"
["e"]=>
string(10) "Original e"
}

View File

@ -0,0 +1,147 @@
--TEST--
Foreach loop tests - substituting the entire iterated entity during the loop.
--FILE--
<?php
class C {
public $a = "Original a";
public $b = "Original b";
public $c = "Original c";
public $d = "Original d";
public $e = "Original e";
}
echo "\nSubstituting the iterated object for a different object.\n";
$obj = new C;
$obj2 = new stdclass;
$obj2->a = "new a";
$obj2->b = "new b";
$obj2->c = "new c";
$obj2->d = "new d";
$obj2->e = "new e";
$obj2->f = "new f";
$ref = &$obj;
$count=0;
foreach ($obj as $v) {
var_dump($v);
if ($v==$obj->b) {
$ref=$obj2;
}
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
echo "\nSubstituting the iterated object for an array.\n";
$obj = new C;
$a = array(1,2,3,4,5,6,7,8);
$ref = &$obj;
$count=0;
foreach ($obj as $v) {
var_dump($v);
if ($v==="Original b") {
$ref=$a;
}
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
echo "\nSubstituting the iterated array for an object.\n";
$a = array(1,2,3,4,5,6,7,8);
$obj = new C;
$ref = &$a;
$count=0;
foreach ($a as $v) {
var_dump($v);
if ($v===2) {
$ref=$obj;
}
if (++$count>10) {
echo "Loop detected.\n";
break;
}
}
var_dump($obj);
?>
--EXPECTF--
Substituting the iterated object for a different object.
string(10) "Original a"
string(10) "Original b"
string(5) "new a"
string(5) "new b"
string(5) "new c"
string(5) "new d"
string(5) "new e"
string(5) "new f"
object(stdClass)#%d (6) {
["a"]=>
string(5) "new a"
["b"]=>
string(5) "new b"
["c"]=>
string(5) "new c"
["d"]=>
string(5) "new d"
["e"]=>
string(5) "new e"
["f"]=>
string(5) "new f"
}
Substituting the iterated object for an array.
string(10) "Original a"
string(10) "Original b"
int(1)
int(2)
int(3)
int(4)
int(5)
int(6)
int(7)
int(8)
array(8) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
[4]=>
int(5)
[5]=>
int(6)
[6]=>
int(7)
[7]=>
int(8)
}
Substituting the iterated array for an object.
int(1)
int(2)
string(10) "Original a"
string(10) "Original b"
string(10) "Original c"
string(10) "Original d"
string(10) "Original e"
object(C)#%d (5) {
["a"]=>
string(10) "Original a"
["b"]=>
string(10) "Original b"
["c"]=>
string(10) "Original c"
["d"]=>
string(10) "Original d"
["e"]=>
string(10) "Original e"
}