@@ -22,187 +22,218 @@ $arr = [
2222];
2323
2424
25- Assert::same (
26- [
27- 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
28- 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
29- 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
30- ],
31- Arrays::associate ($ arr , 'name ' ),
32- );
33-
34- Assert::same (
35- [],
36- Arrays::associate ([], 'name ' ),
37- );
38-
39- Assert::same (
40- [
41- 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
42- 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
43- 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
44- ],
45- Arrays::associate ($ arr , 'name= ' ),
46- );
47-
48- Assert::same (
49- ['John ' => 22 , 'Mary ' => null , 'Paul ' => 44 ],
50- Arrays::associate ($ arr , 'name=age ' ),
51- );
52-
53- Assert::same (// path as array
54- ['John ' => 22 , 'Mary ' => null , 'Paul ' => 44 ],
55- Arrays::associate ($ arr , ['name ' , '= ' , 'age ' ]),
56- );
57-
58- Assert::equal (
59- [
60- 'John ' => (object ) [
61- 'name ' => 'John ' ,
62- 'age ' => 11 ,
63- ],
64- 'Mary ' => (object ) [
65- 'name ' => 'Mary ' ,
66- 'age ' => null ,
67- ],
68- 'Paul ' => (object ) [
69- 'name ' => 'Paul ' ,
70- 'age ' => 44 ,
25+ test ('basic key association ' , function () use ($ arr ) {
26+ Assert::same (
27+ [
28+ 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
29+ 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
30+ 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
7131 ],
72- ],
73- Arrays::associate ($ arr , 'name-> ' ),
74- );
32+ Arrays::associate ($ arr , 'name ' ),
33+ );
34+ });
35+
7536
76- Assert::equal (
77- [
78- 11 => (object ) [
37+ test ('empty array ' , function () {
38+ Assert::same ([], Arrays::associate ([], 'name ' ));
39+ });
40+
41+
42+ test ('key association with whole row as value ' , function () use ($ arr ) {
43+ Assert::same (
44+ [
7945 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
80- ],
81- 22 => (object ) [
82- 'John ' => ['name ' => 'John ' , 'age ' => 22 ],
83- ],
84- '' => (object ) [
8546 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
86- ],
87- 44 => (object ) [
8847 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
8948 ],
90- ],
91- Arrays::associate ($ arr , 'age->name ' ),
92- );
93-
94- Assert::equal (
95- (object ) [
96- 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
97- 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
98- 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
99- ],
100- Arrays::associate ($ arr , '->name ' ),
101- );
102-
103- Assert::equal (
104- (object ) [],
105- Arrays::associate ([], '->name ' ),
106- );
107-
108- Assert::same (
109- [
110- 'John ' => [
111- 11 => ['name ' => 'John ' , 'age ' => 11 ],
112- 22 => ['name ' => 'John ' , 'age ' => 22 ],
113- ],
114- 'Mary ' => [
115- '' => ['name ' => 'Mary ' , 'age ' => null ],
116- ],
117- 'Paul ' => [
118- 44 => ['name ' => 'Paul ' , 'age ' => 44 ],
119- ],
120- ],
121- Arrays::associate ($ arr , 'name|age ' ),
122- );
123-
124- Assert::same (
125- [
126- 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
127- 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
128- 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
129- ],
130- Arrays::associate ($ arr , 'name| ' ),
131- );
132-
133- Assert::same (
134- [
135- 'John ' => [
136- ['name ' => 'John ' , 'age ' => 11 ],
137- ['name ' => 'John ' , 'age ' => 22 ],
138- ],
139- 'Mary ' => [
140- ['name ' => 'Mary ' , 'age ' => null ],
141- ],
142- 'Paul ' => [
143- ['name ' => 'Paul ' , 'age ' => 44 ],
49+ Arrays::associate ($ arr , 'name= ' ),
50+ );
51+ });
52+
53+
54+ test ('key-value pair association ' , function () use ($ arr ) {
55+ Assert::same (
56+ ['John ' => 22 , 'Mary ' => null , 'Paul ' => 44 ],
57+ Arrays::associate ($ arr , 'name=age ' ),
58+ );
59+ });
60+
61+
62+ test ('path as array ' , function () use ($ arr ) {
63+ Assert::same (
64+ ['John ' => 22 , 'Mary ' => null , 'Paul ' => 44 ],
65+ Arrays::associate ($ arr , ['name ' , '= ' , 'age ' ]),
66+ );
67+ });
68+
69+
70+ test ('object result with key-based access ' , function () use ($ arr ) {
71+ Assert::equal (
72+ [
73+ 'John ' => (object ) ['name ' => 'John ' , 'age ' => 11 ],
74+ 'Mary ' => (object ) ['name ' => 'Mary ' , 'age ' => null ],
75+ 'Paul ' => (object ) ['name ' => 'Paul ' , 'age ' => 44 ],
14476 ],
145- ],
146- Arrays::associate ($ arr , 'name[] ' ),
147- );
148-
149- Assert::same (
150- [
151- ['John ' => ['name ' => 'John ' , 'age ' => 11 ]],
152- ['John ' => ['name ' => 'John ' , 'age ' => 22 ]],
153- ['Mary ' => ['name ' => 'Mary ' , 'age ' => null ]],
154- ['Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ]],
155- ],
156- Arrays::associate ($ arr , '[]name ' ),
157- );
158-
159- Assert::same (
160- ['John ' , 'John ' , 'Mary ' , 'Paul ' ],
161- Arrays::associate ($ arr , '[]=name ' ),
162- );
163-
164- Assert::same (
165- [
166- 'John ' => [
167- [11 => ['name ' => 'John ' , 'age ' => 11 ]],
168- [22 => ['name ' => 'John ' , 'age ' => 22 ]],
77+ Arrays::associate ($ arr , 'name-> ' ),
78+ );
79+ });
80+
81+
82+ test ('nested object with property-based keys ' , function () use ($ arr ) {
83+ Assert::equal (
84+ [
85+ 11 => (object ) ['John ' => ['name ' => 'John ' , 'age ' => 11 ]],
86+ 22 => (object ) ['John ' => ['name ' => 'John ' , 'age ' => 22 ]],
87+ '' => (object ) ['Mary ' => ['name ' => 'Mary ' , 'age ' => null ]],
88+ 44 => (object ) ['Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ]],
16989 ],
170- 'Mary ' => [
171- ['' => ['name ' => 'Mary ' , 'age ' => null ]],
90+ Arrays::associate ($ arr , 'age->name ' ),
91+ );
92+ });
93+
94+
95+ test ('object as root result ' , function () use ($ arr ) {
96+ Assert::equal (
97+ (object ) [
98+ 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
99+ 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
100+ 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
172101 ],
173- 'Paul ' => [
174- [44 => ['name ' => 'Paul ' , 'age ' => 44 ]],
102+ Arrays::associate ($ arr , '->name ' ),
103+ );
104+
105+ Assert::equal (
106+ (object ) [],
107+ Arrays::associate ([], '->name ' ),
108+ );
109+ });
110+
111+
112+ test ('grouping with pipe operator ' , function () use ($ arr ) {
113+ Assert::same (
114+ [
115+ 'John ' => [
116+ 11 => ['name ' => 'John ' , 'age ' => 11 ],
117+ 22 => ['name ' => 'John ' , 'age ' => 22 ],
118+ ],
119+ 'Mary ' => [
120+ '' => ['name ' => 'Mary ' , 'age ' => null ],
121+ ],
122+ 'Paul ' => [
123+ 44 => ['name ' => 'Paul ' , 'age ' => 44 ],
124+ ],
125+ ],
126+ Arrays::associate ($ arr , 'name|age ' ),
127+ );
128+ });
129+
130+
131+ test ('grouping with pipe - last value wins on collision ' , function () use ($ arr ) {
132+ Assert::same (
133+ [
134+ 'John ' => ['name ' => 'John ' , 'age ' => 11 ],
135+ 'Mary ' => ['name ' => 'Mary ' , 'age ' => null ],
136+ 'Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ],
175137 ],
176- ],
177- Arrays::associate ($ arr , 'name[]age ' ),
178- );
179-
180- Assert::same (
181- $ arr ,
182- Arrays::associate ($ arr , '[] ' ),
183- );
184-
185- // converts object to array
186- Assert::same (
187- $ arr ,
188- Arrays::associate ($ arr = [
138+ Arrays::associate ($ arr , 'name| ' ),
139+ );
140+ });
141+
142+
143+ test ('array grouping with brackets ' , function () use ($ arr ) {
144+ Assert::same (
145+ [
146+ 'John ' => [
147+ ['name ' => 'John ' , 'age ' => 11 ],
148+ ['name ' => 'John ' , 'age ' => 22 ],
149+ ],
150+ 'Mary ' => [
151+ ['name ' => 'Mary ' , 'age ' => null ],
152+ ],
153+ 'Paul ' => [
154+ ['name ' => 'Paul ' , 'age ' => 44 ],
155+ ],
156+ ],
157+ Arrays::associate ($ arr , 'name[] ' ),
158+ );
159+ });
160+
161+
162+ test ('prefix array with keyed items ' , function () use ($ arr ) {
163+ Assert::same (
164+ [
165+ ['John ' => ['name ' => 'John ' , 'age ' => 11 ]],
166+ ['John ' => ['name ' => 'John ' , 'age ' => 22 ]],
167+ ['Mary ' => ['name ' => 'Mary ' , 'age ' => null ]],
168+ ['Paul ' => ['name ' => 'Paul ' , 'age ' => 44 ]],
169+ ],
170+ Arrays::associate ($ arr , '[]name ' ),
171+ );
172+ });
173+
174+
175+ test ('flat array with extracted values ' , function () use ($ arr ) {
176+ Assert::same (
177+ ['John ' , 'John ' , 'Mary ' , 'Paul ' ],
178+ Arrays::associate ($ arr , '[]=name ' ),
179+ );
180+ });
181+
182+
183+ test ('complex combination with nested arrays ' , function () use ($ arr ) {
184+ Assert::same (
185+ [
186+ 'John ' => [
187+ [11 => ['name ' => 'John ' , 'age ' => 11 ]],
188+ [22 => ['name ' => 'John ' , 'age ' => 22 ]],
189+ ],
190+ 'Mary ' => [
191+ ['' => ['name ' => 'Mary ' , 'age ' => null ]],
192+ ],
193+ 'Paul ' => [
194+ [44 => ['name ' => 'Paul ' , 'age ' => 44 ]],
195+ ],
196+ ],
197+ Arrays::associate ($ arr , 'name[]age ' ),
198+ );
199+ });
200+
201+
202+ test ('identity transformation with empty brackets ' , function () use ($ arr ) {
203+ Assert::same ($ arr , Arrays::associate ($ arr , '[] ' ));
204+ });
205+
206+
207+ test ('converts objects to arrays in input ' , function () {
208+ $ arr = [
189209 (object ) ['name ' => 'John ' , 'age ' => 11 ],
190210 (object ) ['name ' => 'John ' , 'age ' => 22 ],
191211 (object ) ['name ' => 'Mary ' , 'age ' => null ],
192212 (object ) ['name ' => 'Paul ' , 'age ' => 44 ],
193- ], '[] ' ),
194- );
195-
196- // allowes objects in keys
197- Assert::equal (
198- ['2014-02-05 00:00:00 ' => new DateTime ('2014-02-05 ' )],
199- Arrays::associate ($ arr = [
200- ['date ' => new DateTime ('2014-02-05 ' )],
201- ], 'date=date ' ),
202- );
203- Assert::equal (
204- (object ) ['2014-02-05 00:00:00 ' => new DateTime ('2014-02-05 ' )],
205- Arrays::associate ($ arr = [
206- ['date ' => new DateTime ('2014-02-05 ' )],
207- ], '->date=date ' ),
208- );
213+ ];
214+
215+ Assert::same (
216+ [
217+ ['name ' => 'John ' , 'age ' => 11 ],
218+ ['name ' => 'John ' , 'age ' => 22 ],
219+ ['name ' => 'Mary ' , 'age ' => null ],
220+ ['name ' => 'Paul ' , 'age ' => 44 ],
221+ ],
222+ Arrays::associate ($ arr , '[] ' ),
223+ );
224+ });
225+
226+
227+ test ('allows objects as keys and values ' , function () {
228+ $ arr = [['date ' => new DateTime ('2014-02-05 ' )]];
229+
230+ Assert::equal (
231+ ['2014-02-05 00:00:00 ' => new DateTime ('2014-02-05 ' )],
232+ Arrays::associate ($ arr , 'date=date ' ),
233+ );
234+
235+ Assert::equal (
236+ (object ) ['2014-02-05 00:00:00 ' => new DateTime ('2014-02-05 ' )],
237+ Arrays::associate ($ arr , '->date=date ' ),
238+ );
239+ });
0 commit comments