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