1--TEST--
2serialization: arrays with references, nested
3--FILE--
4<?php
5/* Prototype  : proto string serialize(mixed variable)
6 * Description: Returns a string representation of variable (which can later be unserialized)
7 * Source code: ext/standard/var.c
8 * Alias to functions:
9 */
10/* Prototype  : proto mixed unserialize(string variable_representation)
11 * Description: Takes a string representation of variable and recreates it
12 * Source code: ext/standard/var.c
13 * Alias to functions:
14 */
15
16function check(&$a) {
17	var_dump($a);
18	$ser = serialize($a);
19	var_dump($ser);
20
21	$b = unserialize($ser);
22
23	// Change each element and dump result.
24	foreach($b as $k=>$v) {
25		if (is_array($v)){
26			foreach($b[$k] as $sk=>$sv) {
27				$b[$k][$sk] = "b$k.$sk.changed";
28				var_dump($b);
29			}
30		} else {
31			$b[$k] = "b$k.changed";
32			var_dump($b);
33		}
34	}
35}
36
37echo "\n\n--- Nested array references 1 element in containing array:\n";
38$a = array();
39$c = array(1,1,&$a);
40$a[0] = &$c[0];
41$a[1] = 1;
42check($c);
43
44echo "\n\n--- Nested array references 1 element in containing array (slightly different):\n";
45$a = array();
46$c = array(1,&$a,1);
47$a[0] = 1;
48$a[1] = &$c[0];
49check($c);
50
51echo "\n\n--- Nested array references 2 elements in containing array:\n";
52$a = array();
53$c = array(1,1,&$a);
54$a[0] = &$c[0];
55$a[1] = &$c[1];
56check($c);
57
58
59echo "\n\n--- Containing array references 1 element in nested array:\n";
60$a = array();
61$a[0] = 1;
62$a[1] = 1;
63$c = array(1,&$a[0],&$a);
64check($c);
65
66echo "\n\n--- Containing array references 2 elements in nested array:\n";
67$a = array();
68$a[0] = 1;
69$a[1] = 1;
70$c = array(&$a[0],&$a[1],&$a);
71check($c);
72
73echo "\n\n--- Nested array references container:\n";
74$a = array();
75$c = array(1,1,&$a);
76$a[0] = 1;
77$a[1] = &$c;
78check($c);
79
80?>
81--EXPECT--
82--- Nested array references 1 element in containing array:
83array(3) {
84  [0]=>
85  &int(1)
86  [1]=>
87  int(1)
88  [2]=>
89  &array(2) {
90    [0]=>
91    &int(1)
92    [1]=>
93    int(1)
94  }
95}
96string(48) "a:3:{i:0;i:1;i:1;i:1;i:2;a:2:{i:0;R:2;i:1;i:1;}}"
97array(3) {
98  [0]=>
99  &string(10) "b0.changed"
100  [1]=>
101  int(1)
102  [2]=>
103  array(2) {
104    [0]=>
105    &string(10) "b0.changed"
106    [1]=>
107    int(1)
108  }
109}
110array(3) {
111  [0]=>
112  &string(10) "b0.changed"
113  [1]=>
114  string(10) "b1.changed"
115  [2]=>
116  array(2) {
117    [0]=>
118    &string(10) "b0.changed"
119    [1]=>
120    int(1)
121  }
122}
123array(3) {
124  [0]=>
125  &string(12) "b2.0.changed"
126  [1]=>
127  string(10) "b1.changed"
128  [2]=>
129  array(2) {
130    [0]=>
131    &string(12) "b2.0.changed"
132    [1]=>
133    int(1)
134  }
135}
136array(3) {
137  [0]=>
138  &string(12) "b2.0.changed"
139  [1]=>
140  string(10) "b1.changed"
141  [2]=>
142  array(2) {
143    [0]=>
144    &string(12) "b2.0.changed"
145    [1]=>
146    string(12) "b2.1.changed"
147  }
148}
149
150
151--- Nested array references 1 element in containing array (slightly different):
152array(3) {
153  [0]=>
154  &int(1)
155  [1]=>
156  &array(2) {
157    [0]=>
158    int(1)
159    [1]=>
160    &int(1)
161  }
162  [2]=>
163  int(1)
164}
165string(48) "a:3:{i:0;i:1;i:1;a:2:{i:0;i:1;i:1;R:2;}i:2;i:1;}"
166array(3) {
167  [0]=>
168  &string(10) "b0.changed"
169  [1]=>
170  array(2) {
171    [0]=>
172    int(1)
173    [1]=>
174    &string(10) "b0.changed"
175  }
176  [2]=>
177  int(1)
178}
179array(3) {
180  [0]=>
181  &string(10) "b0.changed"
182  [1]=>
183  array(2) {
184    [0]=>
185    string(12) "b1.0.changed"
186    [1]=>
187    &string(10) "b0.changed"
188  }
189  [2]=>
190  int(1)
191}
192array(3) {
193  [0]=>
194  &string(12) "b1.1.changed"
195  [1]=>
196  array(2) {
197    [0]=>
198    string(12) "b1.0.changed"
199    [1]=>
200    &string(12) "b1.1.changed"
201  }
202  [2]=>
203  int(1)
204}
205array(3) {
206  [0]=>
207  &string(12) "b1.1.changed"
208  [1]=>
209  array(2) {
210    [0]=>
211    string(12) "b1.0.changed"
212    [1]=>
213    &string(12) "b1.1.changed"
214  }
215  [2]=>
216  string(10) "b2.changed"
217}
218
219
220--- Nested array references 2 elements in containing array:
221array(3) {
222  [0]=>
223  &int(1)
224  [1]=>
225  &int(1)
226  [2]=>
227  &array(2) {
228    [0]=>
229    &int(1)
230    [1]=>
231    &int(1)
232  }
233}
234string(48) "a:3:{i:0;i:1;i:1;i:1;i:2;a:2:{i:0;R:2;i:1;R:3;}}"
235array(3) {
236  [0]=>
237  &string(10) "b0.changed"
238  [1]=>
239  &int(1)
240  [2]=>
241  array(2) {
242    [0]=>
243    &string(10) "b0.changed"
244    [1]=>
245    &int(1)
246  }
247}
248array(3) {
249  [0]=>
250  &string(10) "b0.changed"
251  [1]=>
252  &string(10) "b1.changed"
253  [2]=>
254  array(2) {
255    [0]=>
256    &string(10) "b0.changed"
257    [1]=>
258    &string(10) "b1.changed"
259  }
260}
261array(3) {
262  [0]=>
263  &string(12) "b2.0.changed"
264  [1]=>
265  &string(10) "b1.changed"
266  [2]=>
267  array(2) {
268    [0]=>
269    &string(12) "b2.0.changed"
270    [1]=>
271    &string(10) "b1.changed"
272  }
273}
274array(3) {
275  [0]=>
276  &string(12) "b2.0.changed"
277  [1]=>
278  &string(12) "b2.1.changed"
279  [2]=>
280  array(2) {
281    [0]=>
282    &string(12) "b2.0.changed"
283    [1]=>
284    &string(12) "b2.1.changed"
285  }
286}
287
288
289--- Containing array references 1 element in nested array:
290array(3) {
291  [0]=>
292  int(1)
293  [1]=>
294  &int(1)
295  [2]=>
296  &array(2) {
297    [0]=>
298    &int(1)
299    [1]=>
300    int(1)
301  }
302}
303string(48) "a:3:{i:0;i:1;i:1;i:1;i:2;a:2:{i:0;R:3;i:1;i:1;}}"
304array(3) {
305  [0]=>
306  string(10) "b0.changed"
307  [1]=>
308  &int(1)
309  [2]=>
310  array(2) {
311    [0]=>
312    &int(1)
313    [1]=>
314    int(1)
315  }
316}
317array(3) {
318  [0]=>
319  string(10) "b0.changed"
320  [1]=>
321  &string(10) "b1.changed"
322  [2]=>
323  array(2) {
324    [0]=>
325    &string(10) "b1.changed"
326    [1]=>
327    int(1)
328  }
329}
330array(3) {
331  [0]=>
332  string(10) "b0.changed"
333  [1]=>
334  &string(12) "b2.0.changed"
335  [2]=>
336  array(2) {
337    [0]=>
338    &string(12) "b2.0.changed"
339    [1]=>
340    int(1)
341  }
342}
343array(3) {
344  [0]=>
345  string(10) "b0.changed"
346  [1]=>
347  &string(12) "b2.0.changed"
348  [2]=>
349  array(2) {
350    [0]=>
351    &string(12) "b2.0.changed"
352    [1]=>
353    string(12) "b2.1.changed"
354  }
355}
356
357
358--- Containing array references 2 elements in nested array:
359array(3) {
360  [0]=>
361  &int(1)
362  [1]=>
363  &int(1)
364  [2]=>
365  &array(2) {
366    [0]=>
367    &int(1)
368    [1]=>
369    &int(1)
370  }
371}
372string(48) "a:3:{i:0;i:1;i:1;i:1;i:2;a:2:{i:0;R:2;i:1;R:3;}}"
373array(3) {
374  [0]=>
375  &string(10) "b0.changed"
376  [1]=>
377  &int(1)
378  [2]=>
379  array(2) {
380    [0]=>
381    &string(10) "b0.changed"
382    [1]=>
383    &int(1)
384  }
385}
386array(3) {
387  [0]=>
388  &string(10) "b0.changed"
389  [1]=>
390  &string(10) "b1.changed"
391  [2]=>
392  array(2) {
393    [0]=>
394    &string(10) "b0.changed"
395    [1]=>
396    &string(10) "b1.changed"
397  }
398}
399array(3) {
400  [0]=>
401  &string(12) "b2.0.changed"
402  [1]=>
403  &string(10) "b1.changed"
404  [2]=>
405  array(2) {
406    [0]=>
407    &string(12) "b2.0.changed"
408    [1]=>
409    &string(10) "b1.changed"
410  }
411}
412array(3) {
413  [0]=>
414  &string(12) "b2.0.changed"
415  [1]=>
416  &string(12) "b2.1.changed"
417  [2]=>
418  array(2) {
419    [0]=>
420    &string(12) "b2.0.changed"
421    [1]=>
422    &string(12) "b2.1.changed"
423  }
424}
425
426
427--- Nested array references container:
428array(3) {
429  [0]=>
430  int(1)
431  [1]=>
432  int(1)
433  [2]=>
434  &array(2) {
435    [0]=>
436    int(1)
437    [1]=>
438    &array(3) {
439      [0]=>
440      int(1)
441      [1]=>
442      int(1)
443      [2]=>
444      *RECURSION*
445    }
446  }
447}
448string(74) "a:3:{i:0;i:1;i:1;i:1;i:2;a:2:{i:0;i:1;i:1;a:3:{i:0;i:1;i:1;i:1;i:2;R:4;}}}"
449array(3) {
450  [0]=>
451  string(10) "b0.changed"
452  [1]=>
453  int(1)
454  [2]=>
455  &array(2) {
456    [0]=>
457    int(1)
458    [1]=>
459    array(3) {
460      [0]=>
461      int(1)
462      [1]=>
463      int(1)
464      [2]=>
465      *RECURSION*
466    }
467  }
468}
469array(3) {
470  [0]=>
471  string(10) "b0.changed"
472  [1]=>
473  string(10) "b1.changed"
474  [2]=>
475  &array(2) {
476    [0]=>
477    int(1)
478    [1]=>
479    array(3) {
480      [0]=>
481      int(1)
482      [1]=>
483      int(1)
484      [2]=>
485      *RECURSION*
486    }
487  }
488}
489array(3) {
490  [0]=>
491  string(10) "b0.changed"
492  [1]=>
493  string(10) "b1.changed"
494  [2]=>
495  &array(2) {
496    [0]=>
497    string(12) "b2.0.changed"
498    [1]=>
499    array(3) {
500      [0]=>
501      int(1)
502      [1]=>
503      int(1)
504      [2]=>
505      *RECURSION*
506    }
507  }
508}
509array(3) {
510  [0]=>
511  string(10) "b0.changed"
512  [1]=>
513  string(10) "b1.changed"
514  [2]=>
515  &array(2) {
516    [0]=>
517    string(12) "b2.0.changed"
518    [1]=>
519    string(12) "b2.1.changed"
520  }
521}
522