1--TEST--
2Cyclic array test
3--INI--
4--SKIPIF--
5<?php
6
7if (version_compare(PHP_VERSION, "8.0.0dev", "<")) {
8    die("skip PHP < 8.0");
9}
10?>
11--FILE--
12<?php
13if(!extension_loaded('msgpack')) {
14    dl('msgpack.' . PHP_SHLIB_SUFFIX);
15}
16
17function test($type, $variable, $test) {
18    $serialized = msgpack_serialize($variable);
19    $unserialized = msgpack_unserialize($serialized);
20
21    echo $type, PHP_EOL;
22    echo bin2hex($serialized), PHP_EOL;
23    var_dump($unserialized);
24    echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL;
25}
26
27$a = array(
28    'a' => array(
29        'b' => 'c',
30        'd' => 'e'
31    ),
32);
33
34$a['f'] = &$a;
35
36test('array', $a, true);
37
38$a = array("foo" => &$b);
39$b = array(1, 2, $a);
40var_dump($a);
41var_dump($k = msgpack_unserialize(msgpack_serialize($a)));
42
43$k["foo"][1] = "b";
44var_dump($k);
45?>
46--EXPECT--
47array
4882a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020003
49array(2) {
50  ["a"]=>
51  array(2) {
52    ["b"]=>
53    string(1) "c"
54    ["d"]=>
55    string(1) "e"
56  }
57  ["f"]=>
58  &array(2) {
59    ["a"]=>
60    array(2) {
61      ["b"]=>
62      string(1) "c"
63      ["d"]=>
64      string(1) "e"
65    }
66    ["f"]=>
67    *RECURSION*
68  }
69}
70OK
71array(1) {
72  ["foo"]=>
73  &array(3) {
74    [0]=>
75    int(1)
76    [1]=>
77    int(2)
78    [2]=>
79    *RECURSION*
80  }
81}
82array(1) {
83  ["foo"]=>
84  &array(3) {
85    [0]=>
86    int(1)
87    [1]=>
88    int(2)
89    [2]=>
90    array(1) {
91      ["foo"]=>
92      *RECURSION*
93    }
94  }
95}
96array(1) {
97  ["foo"]=>
98  &array(3) {
99    [0]=>
100    int(1)
101    [1]=>
102    string(1) "b"
103    [2]=>
104    array(1) {
105      ["foo"]=>
106      *RECURSION*
107    }
108  }
109}
110