1--TEST--
2array_walk() closure tests
3--FILE--
4<?php
5
6$ar = ["one" => 1, "two"=>2, "three" => 3];
7var_dump(array_walk($ar, function(){ var_dump(func_get_args());}));
8
9echo "\nclosure with array\n";
10$ar = ["one" => 1, "two"=>2, "three" => 3];
11$user_data = ["sum" => 42];
12$func = function($value, $key, &$udata) {
13    var_dump($udata);
14    $udata["sum"] += $value;
15};
16
17var_dump(array_walk($ar, $func, $user_data));
18echo "End result:";
19var_dump($user_data["sum"]);
20
21echo "\nclosure with use\n";
22$ar = ["one" => 1, "two"=>2, "three" => 3];
23$user_data = ["sum" => 42];
24$func = function($value, $key) use (&$user_data) {
25    var_dump($user_data);
26    $user_data["sum"] += $value;
27};
28
29var_dump(array_walk($ar, $func, $user_data));
30echo "End result:";
31var_dump($user_data["sum"]);
32
33
34echo "\nclosure with object\n";
35$ar = ["one" => 1, "two"=>2, "three" => 3];
36$user_data = (object)["sum" => 42];
37$func = function($value, $key, &$udata) {
38    var_dump($udata);
39    $udata->sum += $value;
40};
41
42var_dump(array_walk($ar, $func, $user_data));
43echo "End result:";
44var_dump($user_data->sum);
45
46
47
48echo "\nfunction with object\n";
49function sum_it_up_object($value, $key, $udata)
50{
51    var_dump($udata);
52    $udata->sum += $value;
53}
54
55$ar = ["one" => 1, "two"=>2, "three" => 3];
56$user_data = (object)["sum" => 42];
57
58var_dump(array_walk($ar, "sum_it_up_object", $user_data));
59echo "End result:";
60var_dump($user_data->sum);
61
62
63echo "\nfunction with array\n";
64function sum_it_up_array($value, $key, $udata)
65{
66    var_dump($udata);
67    $udata['sum'] += $value;
68}
69
70$ar = ["one" => 1, "two"=>2, "three" => 3];
71$user_data = ["sum" => 42];
72
73var_dump(array_walk($ar, "sum_it_up_array", $user_data));
74echo "End result:";
75var_dump($user_data['sum']);
76
77echo "\nclosure and exception\n";
78$ar = ["one" => 1, "two"=>2, "three" => 3];
79try {
80    var_dump(array_walk($ar, function($v, $k) { if ($v == 2) throw new Exception; } ));
81} catch (Exception $e) {
82    var_dump($e->getTrace());
83}
84
85
86echo "Done\n";
87?>
88--EXPECTF--
89array(2) {
90  [0]=>
91  int(1)
92  [1]=>
93  string(3) "one"
94}
95array(2) {
96  [0]=>
97  int(2)
98  [1]=>
99  string(3) "two"
100}
101array(2) {
102  [0]=>
103  int(3)
104  [1]=>
105  string(5) "three"
106}
107bool(true)
108
109closure with array
110
111Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
112array(1) {
113  ["sum"]=>
114  int(42)
115}
116
117Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
118array(1) {
119  ["sum"]=>
120  int(42)
121}
122
123Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
124array(1) {
125  ["sum"]=>
126  int(42)
127}
128bool(true)
129End result:int(42)
130
131closure with use
132array(1) {
133  ["sum"]=>
134  int(42)
135}
136array(1) {
137  ["sum"]=>
138  int(43)
139}
140array(1) {
141  ["sum"]=>
142  int(45)
143}
144bool(true)
145End result:int(48)
146
147closure with object
148
149Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
150object(stdClass)#1 (1) {
151  ["sum"]=>
152  int(42)
153}
154
155Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
156object(stdClass)#1 (1) {
157  ["sum"]=>
158  int(43)
159}
160
161Warning: {closure:%s:%d}(): Argument #3 ($udata) must be passed by reference, value given in %s on line %d
162object(stdClass)#1 (1) {
163  ["sum"]=>
164  int(45)
165}
166bool(true)
167End result:int(48)
168
169function with object
170object(stdClass)#2 (1) {
171  ["sum"]=>
172  int(42)
173}
174object(stdClass)#2 (1) {
175  ["sum"]=>
176  int(43)
177}
178object(stdClass)#2 (1) {
179  ["sum"]=>
180  int(45)
181}
182bool(true)
183End result:int(48)
184
185function with array
186array(1) {
187  ["sum"]=>
188  int(42)
189}
190array(1) {
191  ["sum"]=>
192  int(42)
193}
194array(1) {
195  ["sum"]=>
196  int(42)
197}
198bool(true)
199End result:int(42)
200
201closure and exception
202array(2) {
203  [0]=>
204  array(2) {
205    ["function"]=>
206    string(%d) "{closure:%s:%d}"
207    ["args"]=>
208    array(2) {
209      [0]=>
210      int(2)
211      [1]=>
212      string(3) "two"
213    }
214  }
215  [1]=>
216  array(4) {
217    ["file"]=>
218    string(%d) "%s"
219    ["line"]=>
220    int(%d)
221    ["function"]=>
222    string(10) "array_walk"
223    ["args"]=>
224    array(2) {
225      [0]=>
226      array(3) {
227        ["one"]=>
228        int(1)
229        ["two"]=>
230        int(2)
231        ["three"]=>
232        int(3)
233      }
234      [1]=>
235      object(Closure)#%d (4) {
236        ["name"]=>
237        string(%d) "{closure:%s:%d}"
238        ["file"]=>
239        string(%d) "%s"
240        ["line"]=>
241        int(%d)
242        ["parameter"]=>
243        array(2) {
244          ["$v"]=>
245          string(10) "<required>"
246          ["$k"]=>
247          string(10) "<required>"
248        }
249      }
250    }
251  }
252}
253Done
254