xref: /PHP-5.5/tests/lang/foreachLoop.015.phpt (revision 176012df)
1--TEST--
2Directly modifying a REFERENCED array when foreach'ing over it while using &$value syntax.
3--FILE--
4<?php
5
6define('MAX_LOOPS',5);
7
8function withRefValue($elements, $transform) {
9	echo "\n---( Array with $elements element(s): )---\n";
10	//Build array:
11	for ($i=0; $i<$elements; $i++) {
12		$a[] = "v.$i";
13	}
14	$counter=0;
15
16	$ref = &$a;
17
18	echo "--> State of referenced array before loop:\n";
19	var_dump($a);
20
21	echo "--> Do loop:\n";
22	foreach ($a as $k=>&$v) {
23		echo "     iteration $counter:  \$k=$k; \$v=$v\n";
24		eval($transform);
25		$counter++;
26		if ($counter>MAX_LOOPS) {
27			echo "  ** Stuck in a loop! **\n";
28			break;
29		}
30	}
31
32	echo "--> State of array after loop:\n";
33	var_dump($a);
34}
35
36
37echo "\nPopping elements off end of a referenced array, using &\$value";
38$transform = 'array_pop($a);';
39withRefValue(1, $transform);
40withRefValue(2, $transform);
41withRefValue(3, $transform);
42withRefValue(4, $transform);
43
44echo "\n\n\nShift elements off start of a referenced array, using &\$value";
45$transform = 'array_shift($a);';
46withRefValue(1, $transform);
47withRefValue(2, $transform);
48withRefValue(3, $transform);
49withRefValue(4, $transform);
50
51echo "\n\n\nRemove current element of a referenced array, using &\$value";
52$transform = 'unset($a[$k]);';
53withRefValue(1, $transform);
54withRefValue(2, $transform);
55withRefValue(3, $transform);
56withRefValue(4, $transform);
57
58echo "\n\n\nAdding elements to the end of a referenced array, using &\$value";
59$transform = 'array_push($a, "new.$counter");';
60withRefValue(1, $transform);
61withRefValue(2, $transform);
62withRefValue(3, $transform);
63withRefValue(4, $transform);
64
65echo "\n\n\nAdding elements to the start of a referenced array, using &\$value";
66$transform = 'array_unshift($a, "new.$counter");';
67withRefValue(1, $transform);
68withRefValue(2, $transform);
69withRefValue(3, $transform);
70withRefValue(4, $transform);
71
72?>
73--EXPECTF--
74
75Popping elements off end of a referenced array, using &$value
76---( Array with 1 element(s): )---
77--> State of referenced array before loop:
78array(1) {
79  [0]=>
80  string(3) "v.0"
81}
82--> Do loop:
83     iteration 0:  $k=0; $v=v.0
84--> State of array after loop:
85array(0) {
86}
87
88---( Array with 2 element(s): )---
89--> State of referenced array before loop:
90array(2) {
91  [0]=>
92  string(3) "v.0"
93  [1]=>
94  string(3) "v.1"
95}
96--> Do loop:
97     iteration 0:  $k=0; $v=v.0
98     iteration 1:  $k=0; $v=v.0
99--> State of array after loop:
100array(0) {
101}
102
103---( Array with 3 element(s): )---
104--> State of referenced array before loop:
105array(3) {
106  [0]=>
107  string(3) "v.0"
108  [1]=>
109  string(3) "v.1"
110  [2]=>
111  string(3) "v.2"
112}
113--> Do loop:
114     iteration 0:  $k=0; $v=v.0
115     iteration 1:  $k=1; $v=v.1
116--> State of array after loop:
117array(1) {
118  [0]=>
119  string(3) "v.0"
120}
121
122---( Array with 4 element(s): )---
123--> State of referenced array before loop:
124array(4) {
125  [0]=>
126  string(3) "v.0"
127  [1]=>
128  string(3) "v.1"
129  [2]=>
130  string(3) "v.2"
131  [3]=>
132  string(3) "v.3"
133}
134--> Do loop:
135     iteration 0:  $k=0; $v=v.0
136     iteration 1:  $k=1; $v=v.1
137     iteration 2:  $k=0; $v=v.0
138     iteration 3:  $k=0; $v=v.0
139--> State of array after loop:
140array(0) {
141}
142
143
144
145Shift elements off start of a referenced array, using &$value
146---( Array with 1 element(s): )---
147--> State of referenced array before loop:
148array(1) {
149  [0]=>
150  string(3) "v.0"
151}
152--> Do loop:
153     iteration 0:  $k=0; $v=v.0
154--> State of array after loop:
155array(0) {
156}
157
158---( Array with 2 element(s): )---
159--> State of referenced array before loop:
160array(2) {
161  [0]=>
162  string(3) "v.0"
163  [1]=>
164  string(3) "v.1"
165}
166--> Do loop:
167     iteration 0:  $k=0; $v=v.0
168     iteration 1:  $k=0; $v=v.1
169--> State of array after loop:
170array(0) {
171}
172
173---( Array with 3 element(s): )---
174--> State of referenced array before loop:
175array(3) {
176  [0]=>
177  string(3) "v.0"
178  [1]=>
179  string(3) "v.1"
180  [2]=>
181  string(3) "v.2"
182}
183--> Do loop:
184     iteration 0:  $k=0; $v=v.0
185     iteration 1:  $k=0; $v=v.1
186     iteration 2:  $k=0; $v=v.2
187--> State of array after loop:
188array(0) {
189}
190
191---( Array with 4 element(s): )---
192--> State of referenced array before loop:
193array(4) {
194  [0]=>
195  string(3) "v.0"
196  [1]=>
197  string(3) "v.1"
198  [2]=>
199  string(3) "v.2"
200  [3]=>
201  string(3) "v.3"
202}
203--> Do loop:
204     iteration 0:  $k=0; $v=v.0
205     iteration 1:  $k=0; $v=v.1
206     iteration 2:  $k=0; $v=v.2
207     iteration 3:  $k=0; $v=v.3
208--> State of array after loop:
209array(0) {
210}
211
212
213
214Remove current element of a referenced array, using &$value
215---( Array with 1 element(s): )---
216--> State of referenced array before loop:
217array(1) {
218  [0]=>
219  string(3) "v.0"
220}
221--> Do loop:
222     iteration 0:  $k=0; $v=v.0
223--> State of array after loop:
224array(0) {
225}
226
227---( Array with 2 element(s): )---
228--> State of referenced array before loop:
229array(2) {
230  [0]=>
231  string(3) "v.0"
232  [1]=>
233  string(3) "v.1"
234}
235--> Do loop:
236     iteration 0:  $k=0; $v=v.0
237     iteration 1:  $k=1; $v=v.1
238--> State of array after loop:
239array(0) {
240}
241
242---( Array with 3 element(s): )---
243--> State of referenced array before loop:
244array(3) {
245  [0]=>
246  string(3) "v.0"
247  [1]=>
248  string(3) "v.1"
249  [2]=>
250  string(3) "v.2"
251}
252--> Do loop:
253     iteration 0:  $k=0; $v=v.0
254     iteration 1:  $k=1; $v=v.1
255     iteration 2:  $k=2; $v=v.2
256--> State of array after loop:
257array(0) {
258}
259
260---( Array with 4 element(s): )---
261--> State of referenced array before loop:
262array(4) {
263  [0]=>
264  string(3) "v.0"
265  [1]=>
266  string(3) "v.1"
267  [2]=>
268  string(3) "v.2"
269  [3]=>
270  string(3) "v.3"
271}
272--> Do loop:
273     iteration 0:  $k=0; $v=v.0
274     iteration 1:  $k=1; $v=v.1
275     iteration 2:  $k=2; $v=v.2
276     iteration 3:  $k=3; $v=v.3
277--> State of array after loop:
278array(0) {
279}
280
281
282
283Adding elements to the end of a referenced array, using &$value
284---( Array with 1 element(s): )---
285--> State of referenced array before loop:
286array(1) {
287  [0]=>
288  string(3) "v.0"
289}
290--> Do loop:
291     iteration 0:  $k=0; $v=v.0
292--> State of array after loop:
293array(2) {
294  [0]=>
295  &string(3) "v.0"
296  [1]=>
297  string(5) "new.0"
298}
299
300---( Array with 2 element(s): )---
301--> State of referenced array before loop:
302array(2) {
303  [0]=>
304  string(3) "v.0"
305  [1]=>
306  string(3) "v.1"
307}
308--> Do loop:
309     iteration 0:  $k=0; $v=v.0
310     iteration 1:  $k=1; $v=v.1
311     iteration 2:  $k=2; $v=new.0
312     iteration 3:  $k=3; $v=new.1
313     iteration 4:  $k=4; $v=new.2
314     iteration 5:  $k=5; $v=new.3
315  ** Stuck in a loop! **
316--> State of array after loop:
317array(8) {
318  [0]=>
319  string(3) "v.0"
320  [1]=>
321  string(3) "v.1"
322  [2]=>
323  string(5) "new.0"
324  [3]=>
325  string(5) "new.1"
326  [4]=>
327  string(5) "new.2"
328  [5]=>
329  &string(5) "new.3"
330  [6]=>
331  string(5) "new.4"
332  [7]=>
333  string(5) "new.5"
334}
335
336---( Array with 3 element(s): )---
337--> State of referenced array before loop:
338array(3) {
339  [0]=>
340  string(3) "v.0"
341  [1]=>
342  string(3) "v.1"
343  [2]=>
344  string(3) "v.2"
345}
346--> Do loop:
347     iteration 0:  $k=0; $v=v.0
348     iteration 1:  $k=1; $v=v.1
349     iteration 2:  $k=2; $v=v.2
350     iteration 3:  $k=3; $v=new.0
351     iteration 4:  $k=4; $v=new.1
352     iteration 5:  $k=5; $v=new.2
353  ** Stuck in a loop! **
354--> State of array after loop:
355array(9) {
356  [0]=>
357  string(3) "v.0"
358  [1]=>
359  string(3) "v.1"
360  [2]=>
361  string(3) "v.2"
362  [3]=>
363  string(5) "new.0"
364  [4]=>
365  string(5) "new.1"
366  [5]=>
367  &string(5) "new.2"
368  [6]=>
369  string(5) "new.3"
370  [7]=>
371  string(5) "new.4"
372  [8]=>
373  string(5) "new.5"
374}
375
376---( Array with 4 element(s): )---
377--> State of referenced array before loop:
378array(4) {
379  [0]=>
380  string(3) "v.0"
381  [1]=>
382  string(3) "v.1"
383  [2]=>
384  string(3) "v.2"
385  [3]=>
386  string(3) "v.3"
387}
388--> Do loop:
389     iteration 0:  $k=0; $v=v.0
390     iteration 1:  $k=1; $v=v.1
391     iteration 2:  $k=2; $v=v.2
392     iteration 3:  $k=3; $v=v.3
393     iteration 4:  $k=4; $v=new.0
394     iteration 5:  $k=5; $v=new.1
395  ** Stuck in a loop! **
396--> State of array after loop:
397array(10) {
398  [0]=>
399  string(3) "v.0"
400  [1]=>
401  string(3) "v.1"
402  [2]=>
403  string(3) "v.2"
404  [3]=>
405  string(3) "v.3"
406  [4]=>
407  string(5) "new.0"
408  [5]=>
409  &string(5) "new.1"
410  [6]=>
411  string(5) "new.2"
412  [7]=>
413  string(5) "new.3"
414  [8]=>
415  string(5) "new.4"
416  [9]=>
417  string(5) "new.5"
418}
419
420
421
422Adding elements to the start of a referenced array, using &$value
423---( Array with 1 element(s): )---
424--> State of referenced array before loop:
425array(1) {
426  [0]=>
427  string(3) "v.0"
428}
429--> Do loop:
430     iteration 0:  $k=0; $v=v.0
431--> State of array after loop:
432array(2) {
433  [0]=>
434  string(5) "new.0"
435  [1]=>
436  &string(3) "v.0"
437}
438
439---( Array with 2 element(s): )---
440--> State of referenced array before loop:
441array(2) {
442  [0]=>
443  string(3) "v.0"
444  [1]=>
445  string(3) "v.1"
446}
447--> Do loop:
448     iteration 0:  $k=0; $v=v.0
449     iteration 1:  $k=0; $v=new.0
450     iteration 2:  $k=0; $v=new.1
451     iteration 3:  $k=0; $v=new.2
452     iteration 4:  $k=0; $v=new.3
453     iteration 5:  $k=0; $v=new.4
454  ** Stuck in a loop! **
455--> State of array after loop:
456array(8) {
457  [0]=>
458  string(5) "new.5"
459  [1]=>
460  &string(5) "new.4"
461  [2]=>
462  string(5) "new.3"
463  [3]=>
464  string(5) "new.2"
465  [4]=>
466  string(5) "new.1"
467  [5]=>
468  string(5) "new.0"
469  [6]=>
470  string(3) "v.0"
471  [7]=>
472  string(3) "v.1"
473}
474
475---( Array with 3 element(s): )---
476--> State of referenced array before loop:
477array(3) {
478  [0]=>
479  string(3) "v.0"
480  [1]=>
481  string(3) "v.1"
482  [2]=>
483  string(3) "v.2"
484}
485--> Do loop:
486     iteration 0:  $k=0; $v=v.0
487     iteration 1:  $k=0; $v=new.0
488     iteration 2:  $k=0; $v=new.1
489     iteration 3:  $k=0; $v=new.2
490     iteration 4:  $k=0; $v=new.3
491     iteration 5:  $k=0; $v=new.4
492  ** Stuck in a loop! **
493--> State of array after loop:
494array(9) {
495  [0]=>
496  string(5) "new.5"
497  [1]=>
498  &string(5) "new.4"
499  [2]=>
500  string(5) "new.3"
501  [3]=>
502  string(5) "new.2"
503  [4]=>
504  string(5) "new.1"
505  [5]=>
506  string(5) "new.0"
507  [6]=>
508  string(3) "v.0"
509  [7]=>
510  string(3) "v.1"
511  [8]=>
512  string(3) "v.2"
513}
514
515---( Array with 4 element(s): )---
516--> State of referenced array before loop:
517array(4) {
518  [0]=>
519  string(3) "v.0"
520  [1]=>
521  string(3) "v.1"
522  [2]=>
523  string(3) "v.2"
524  [3]=>
525  string(3) "v.3"
526}
527--> Do loop:
528     iteration 0:  $k=0; $v=v.0
529     iteration 1:  $k=0; $v=new.0
530     iteration 2:  $k=0; $v=new.1
531     iteration 3:  $k=0; $v=new.2
532     iteration 4:  $k=0; $v=new.3
533     iteration 5:  $k=0; $v=new.4
534  ** Stuck in a loop! **
535--> State of array after loop:
536array(10) {
537  [0]=>
538  string(5) "new.5"
539  [1]=>
540  &string(5) "new.4"
541  [2]=>
542  string(5) "new.3"
543  [3]=>
544  string(5) "new.2"
545  [4]=>
546  string(5) "new.1"
547  [5]=>
548  string(5) "new.0"
549  [6]=>
550  string(3) "v.0"
551  [7]=>
552  string(3) "v.1"
553  [8]=>
554  string(3) "v.2"
555  [9]=>
556  string(3) "v.3"
557}
558