Skip to content

Commit 974bef4

Browse files
authored
Merge pull request #17 from AlaaSarhan/15-add-reverse-flatten-functionality
Add reverse flatten functionality
2 parents db1b92a + df2f48d commit 974bef4

7 files changed

+628
-127
lines changed

README.md

+123-99
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,36 @@ $multiArray = [
2626
'hi' => [ 'de' => 'Hallo', 'es' => 'Hola' ]
2727
];
2828

29-
$array = Flatten::flatten($multiArray);
30-
31-
/* print_r($array) gives:
32-
33-
Array
34-
(
35-
[say] => what
36-
[hi.de] => Hallo
37-
[hi.es] => Hola
38-
)
29+
/*
30+
Flatten::__construct(
31+
string $separator = '.',
32+
string $prefix = '',
33+
int $flags = 0
34+
)
35+
*/
36+
$flatten = new Flatten();
37+
38+
// Flatten::flattenToArray is provided for convinience. It internally
39+
// calls Flatten::flatten and converts it's output, which is a 1-dimensional
40+
// iterator, into a 1-dimensional array.
41+
$flattened = $flatten->flattenToArray($multiArray);
42+
43+
// Flatten::unflattenToArray is provided for convinience. It internally
44+
// calls Flatten::unflatten and converts it's output, which is a recursive
45+
// generator structure, into a multi-dimensional array.
46+
$unflattened = $flatten->unflattenToArray($flattened);
47+
48+
/*
49+
assert($flattened == [
50+
'say' => what
51+
'hi.de' => Hallo
52+
'hi.es' => Hola
53+
]);
54+
55+
assert($unflattened == $multiArray);
3956
*/
4057
```
58+
4159
**Example 2**
4260

4361
Custom Separator and initial prefix
@@ -49,25 +67,31 @@ $allowAccess = [
4967
'var' => [ 'log' => ['nginx' => true, 'apt' => false], 'www' => true ],
5068
];
5169

52-
$allowAccess = Flatten::flatten($allowAccess, '/', '/');
70+
$flatten = new Flatten(
71+
'/', // separator
72+
'/' // prefix
73+
);
74+
75+
$flattened = $flatten->flattenToArray($allowAccess);
5376

54-
/* var_dump($array) gives:
77+
$unflattened = $flatten->unflattenToArray($flattened);
5578

56-
array(4) {
57-
'/root' =>
58-
bool(false)
59-
'/var/log/nginx' =>
60-
bool(true)
61-
'/var/log/apt' =>
62-
bool(false)
63-
'/var/www' =>
64-
bool(true)
65-
}
79+
/*
80+
assert($flatten == [
81+
'/root' => false,
82+
'/var/log/nginx' => true,
83+
'/var/log/apt' => false,
84+
'/var/www' => true
85+
]);
86+
87+
assert($unflattened == $allowAccess);
6688
*/
6789
```
90+
6891
**Example 3**
6992

7093
Notice that the prefix will not be separated in FQkeys. If it should be separated, separator must be appeneded to the prefix string.
94+
7195
```php
7296
use Sarhan\Flatten\Flatten;
7397

@@ -76,20 +100,23 @@ $api = [
76100
'tag' => [ 'soccer' => 7124, 'tennis' => [ 'singles' => 9833, 'doubles' => 27127 ] ],
77101
];
78102

79-
$uris = Flatten::flatten($api, '/', 'https://api.dummyhost.domain/');
103+
$flatten = new Flatten('/', 'https://api.dummyhost.domain/');
80104

81-
/* print_r($uris) gives:
105+
$flattened = $flatten->flattenToArray($api);
82106

83-
Array
84-
(
85-
[https://api.dummyhost.domain/category/health] => 321
86-
[https://api.dummyhost.domain/category/sport] => 769
87-
[https://api.dummyhost.domain/category/fashion] => 888
88-
[https://api.dummyhost.domain/tag/soccer] => 7124
89-
[https://api.dummyhost.domain/tag/tennis/singles] => 9833
90-
[https://api.dummyhost.domain/tag/tennis/doubles] => 27127
91-
)
107+
$unflattened = $flatten->unflattenToArray($flattened);
92108

109+
/*
110+
assert($flattened == [
111+
'https://api.dummyhost.domain/category/health' => 321,
112+
'https://api.dummyhost.domain/category/sport' => 769,
113+
'https://api.dummyhost.domain/category/fashion' => 888,
114+
'https://api.dummyhost.domain/tag/soccer' => 7124,
115+
'https://api.dummyhost.domain/tag/tennis/singles' => 9833,
116+
'https://api.dummyhost.domain/tag/tennis/doubles' => 27127
117+
]);
118+
119+
assert($unflattened == $api);
93120
*/
94121
```
95122

@@ -107,19 +134,24 @@ $nutrition = [
107134
'fruits' => [ 'oranges', 'apple', 'banana' ],
108135
'veggies' => ['lettuce', 'broccoli'],
109136
];
110-
111-
$nutrition = Flatten::flatten($nutrition, '-');
112-
113-
/* print_r($nutrition):
114-
Array
115-
(
116-
[0] => nutrition
117-
[fruits-0] => oranges
118-
[fruits-1] => apple
119-
[fruits-2] => banana
120-
[veggies-0] => lettuce
121-
[veggies-1] => broccoli
122-
)
137+
138+
$flatten = new Flatten('-');
139+
140+
$flattened = $flatten->flattenToArray($nutrition);
141+
142+
$unflattened = $flatten->unflattenToArray($flattened);
143+
144+
/*
145+
assert($flattened == [
146+
'0' => 'nutrition',
147+
'fruits-0' => 'oranges',
148+
'fruits-1' => 'apple',
149+
'fruits-2' => 'banana',
150+
'veggies-0' => 'lettuce',
151+
'veggies-1' => 'broccoli'
152+
]);
153+
154+
assert($unflattened == $nutrition);
123155
*/
124156
```
125157

@@ -142,36 +174,36 @@ $examples = [
142174
'values' => [3 => 'hello world', 5 => 'what is your name?']
143175
];
144176

145-
$flattened = Flatten::flatten($examples, '.', 'examples.', Flatten::FLAG_NUMERIC_NOT_FLATTENED);
146-
147-
/* print_r($flattened):
148-
Array
149-
(
150-
[examples.templates] => Array
151-
(
152-
[0] => Array
153-
(
154-
[lang] => js
155-
[template] => console.log('%s');
156-
)
157-
158-
[1] => Array
159-
(
160-
[lang] => php
161-
[template] => echo "%s";
162-
)
163-
164-
)
165-
166-
[examples.values] => Array
167-
(
168-
[3] => hello world
169-
[5] => what is your name?
170-
)
177+
$flatten = new Flatten(
178+
'.',
179+
'examples.',
180+
Flatten::FLAG_NUMERIC_NOT_FLATTENED
181+
);
182+
183+
$flattened = $flatten->flattenToArray($examples);
184+
185+
$unflattened = $flatten->unflattenToArray($flattened);
186+
187+
/*
188+
assert($flattened == [
189+
'examples.templates' => [
190+
[
191+
'lang' => 'js',
192+
'template' => 'console.log(\'%s\')';
193+
],
194+
[
195+
'lang' => 'php',
196+
'template' => 'echo "%s"'
197+
]
198+
],
199+
'examples.values' => [
200+
3 => 'hello world',
201+
5 => 'what is your name?'
202+
]
203+
]);
171204

172-
)
205+
assert($unflattened == $examples);
173206
*/
174-
175207
```
176208
Top level numeric (integer) keys will also be returned into an array assigned to the passed prefix.
177209

@@ -187,31 +219,23 @@ $seats = [
187219
'_blocked' => ['B2']
188220
];
189221

190-
$flattened = Flatten::flatten($seats, '_', 'seats', Flatten::FLAG_NUMERIC_NOT_FLATTENED);
191-
192-
/* print_r($flattened)
193-
194-
Array
195-
(
196-
[seats] => Array
197-
(
198-
[0] => A1
199-
[1] => A2
200-
[2] => B1
201-
[3] => B2
202-
)
203-
204-
[seats_reserved] => Array
205-
(
206-
[0] => A1
207-
[1] => B1
208-
)
209-
210-
[seats_blocked] => Array
211-
(
212-
[0] => B2
213-
)
214-
)
222+
$flatten = new Flatten(
223+
'_',
224+
'seats',
225+
Flatten::FLAG_NUMERIC_NOT_FLATTENED
226+
);
227+
228+
$flattened = $flatten->flattenToArray($seats);
229+
230+
$unflattened = $flatten->unflattenToArray($flattened);
231+
232+
/*
233+
assert($flattened == [
234+
'seats' => ['A1', 'A2', 'B1', 'B2'],
235+
'seats_reserved' => ['A1', 'B1'],
236+
'seats_blocked' => ['B2']
237+
]);
215238

239+
assert($unflattened == $seats);
216240
*/
217241
```

src/EmptySeparatorException.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Sarhan\Flatten;
4+
5+
class EmptySeparatorException extends \Exception
6+
{
7+
public function __construct()
8+
{
9+
parent::__construct('Cannot unflatten with an empty separator');
10+
}
11+
}

0 commit comments

Comments
 (0)