Skip to content

Commit db1b92a

Browse files
authored
Merge pull request #16 from AlaaSarhan/14-make-methods-non-static
Make methods non static
2 parents 2e3d1db + ec772e9 commit db1b92a

File tree

3 files changed

+77
-37
lines changed

3 files changed

+77
-37
lines changed

README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# php-flatten
22

33
[![Latest Version](https://img.shields.io/github/release/AlaaSarhan/php-flatten.svg?style=flat-square)](https://github.com/AlaaSarhan/php-flatten/releases)
4-
[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
4+
[![Software License](https://img.shields.io/badge/license-LGPL_v3.0-brightgreen.svg?style=flat-square)](LICENSE)
55
[![Build Status](https://travis-ci.org/AlaaSarhan/php-flatten.svg?branch=master)](https://travis-ci.org/AlaaSarhan/php-flatten)
66
[![Total Downloads](https://img.shields.io/packagist/dt/sarhan/php-flatten.svg?style=flat-square)](https://packagist.org/packages/sarhan/php-flatten)
77

@@ -10,7 +10,7 @@ and joining them with a customizable separator to from fully-qualified keys in t
1010

1111
## Installation
1212

13-
```
13+
```bash
1414
composer require sarhan/php-flatten
1515
```
1616

@@ -19,7 +19,7 @@ and joining them with a customizable separator to from fully-qualified keys in t
1919
**Example 1**
2020

2121
```php
22-
use Sarhan\Flatten;
22+
use Sarhan\Flatten\Flatten;
2323

2424
$multiArray = [
2525
'say' => 'what',
@@ -42,7 +42,7 @@ $array = Flatten::flatten($multiArray);
4242

4343
Custom Separator and initial prefix
4444
```php
45-
use Sarhan\Flatten;
45+
use Sarhan\Flatten\Flatten;
4646

4747
$allowAccess = [
4848
'root' => false,
@@ -69,7 +69,7 @@ $allowAccess = Flatten::flatten($allowAccess, '/', '/');
6969

7070
Notice that the prefix will not be separated in FQkeys. If it should be separated, separator must be appeneded to the prefix string.
7171
```php
72-
use Sarhan\Flatten;
72+
use Sarhan\Flatten\Flatten;
7373

7474
$api = [
7575
'category' => [ 'health' => 321, 'sport' => 769, 'fashion' => 888 ],
@@ -100,7 +100,7 @@ Numeric keys are treated as associative keys.
100100
**Note:** This behavior can be changed using flags. See [FLAG_NUMERIC_NOT_FLATTENED](#numeric_not_flattened)
101101

102102
```php
103-
use Sarhan\Flatten;
103+
use Sarhan\Flatten\Flatten;
104104

105105
$nutrition = [
106106
'nutrition',
@@ -130,8 +130,9 @@ $nutrition = Flatten::flatten($nutrition, '-');
130130
Turns off flattening values with numeric (integer) keys.
131131

132132
Those values will be wrapped in an array (preserving their keys) and associated to the parent FQK.
133+
133134
```php
134-
use Sarhan\Flatten;
135+
use Sarhan\Flatten\Flatten;
135136

136137
$examples = [
137138
'templates' => [
@@ -173,8 +174,9 @@ Array
173174

174175
```
175176
Top level numeric (integer) keys will also be returned into an array assigned to the passed prefix.
177+
176178
```php
177-
use Sarhan\Flatten;
179+
use Sarhan\Flatten\Flatten;
178180

179181
$seats = [
180182
'A1',

src/Flatten.php

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,68 +3,97 @@
33
namespace Sarhan\Flatten;
44

55
/**
6-
* @author Alaa Sarhan <sarhan.alaa@gmail.com>
7-
* @license LGPL
6+
* Flattens values, possibly traversables, into a one-dimensional array, recursively.
87
*/
98
class Flatten
109
{
10+
const DEFAULT_SEPARATOR = '.';
11+
const DEFAULT_PREFIX = '';
12+
const DEFAULT_FLAGS = 0;
13+
1114
/**
1215
* Turn off flattening values with integer keys.
1316
*/
1417
const FLAG_NUMERIC_NOT_FLATTENED = 0b1;
18+
19+
/**
20+
* @var string $separator
21+
*/
22+
private $separator;
23+
24+
/**
25+
* @var string $prefix
26+
*/
27+
private $prefix;
28+
29+
/**
30+
* @var int $flags
31+
*/
32+
private $flags;
33+
34+
/**
35+
* @param string $separator
36+
* @param string $prefix
37+
* @param int $flags
38+
* @return Flatten
39+
* @see Flatten::FLAG_NUMERIC_NOT_FLATTENED
40+
*/
41+
public function __construct(
42+
$separator = self::DEFAULT_SEPARATOR,
43+
$prefix = self::DEFAULT_PREFIX,
44+
$flags = self::DEFAULT_FLAGS
45+
) {
46+
$this->separator = $separator;
47+
$this->prefix = $prefix;
48+
$this->flags = $flags;
49+
}
1550

1651
/**
17-
* Flattens a variable, possibly traversable, into a one-dimensional array, recursively.
52+
* Flattens a traversable or array into a 1-dimensional array.
1853
*
1954
* Each key (fully-qualified key or FQK) in the returned one-dimensional array is the join of all keys leading to
20-
* each (non-traversable) value, in all dimensions, separated by a given separator.
55+
* each (non-traversable) value, in all dimensions, separated by the configured separator.
2156
*
22-
* An initial prefix can be optionally provided, but it will not be separated with the specified separator.
57+
* The configured prefix will be appended to all FQKs, but it will not be separated with the configured separator.
2358
*
2459
* @param mixed $var
25-
* @param string $separator
26-
* @param string $prefix
27-
* @param int $flags
2860
* @return array 1-dimensional array containing all values from all possible traversable dimensions in given input.
29-
* @see Flatten::FLAG_NUMERIC_NOT_FLATTENED
3061
*/
31-
public static function flatten($var, $separator = '.', $prefix = '', $flags = 0)
62+
public function flatten($var)
3263
{
33-
$flattened = [];
34-
foreach (self::flattenGenerator($var, $separator, '', $flags) as $key => $value) {
35-
$flattened[$prefix . $key] = $value;
64+
foreach ($this->flattenGenerator($var, $this->separator, '', $this->flags) as $key => $value) {
65+
yield ($this->prefix . $key) => $value;
3666
}
37-
return $flattened;
3867
}
3968

40-
private static function flattenGenerator($var, $separator, $prefix = '', $flags = 0)
69+
private function flattenGenerator($var, $separator, $prefix = '', $flags = 0)
4170
{
42-
if (!self::canTraverse($var)) {
71+
if (!$this->canTraverse($var)) {
4372
yield $prefix => $var;
4473
return;
4574
}
4675

4776
if ($flags & self::FLAG_NUMERIC_NOT_FLATTENED) {
48-
list ($values, $var) = self::filterNumericKeysAndGetValues($var);
77+
list ($values, $var) = $this->filterNumericKeysAndGetValues($var);
4978
if (!empty($values) || empty($var)) {
5079
yield $prefix => $values;
5180
}
5281
}
5382

5483
$prefix .= (empty($prefix) ? '' : $separator);
5584
foreach ($var as $key => $value) {
56-
foreach (self::flattenGenerator($value, $separator, $prefix . $key, $flags) as $k => $v) {
85+
foreach ($this->flattenGenerator($value, $separator, $prefix . $key, $flags) as $k => $v) {
5786
yield $k => $v;
5887
}
5988
}
6089
}
6190

62-
private static function canTraverse($var)
91+
private function canTraverse($var)
6392
{
6493
return is_array($var) || ($var instanceof \Traversable);
6594
}
6695

67-
private static function filterNumericKeysAndGetValues($var)
96+
private function filterNumericKeysAndGetValues($var)
6897
{
6998
$values = [];
7099
$var = array_filter($var, function ($value, $key) use (&$values) {

test/FlattenTest.php

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function scalarProvider()
2525
*/
2626
public function testFlattenScalar($input, $expectedOutput)
2727
{
28-
$output = Flatten::flatten($input);
28+
$output = $this->flattenToArray($input);
2929

3030
$this->assertEquals($expectedOutput, $output);
3131
}
@@ -46,9 +46,9 @@ public function scalarSeparatorPrefixProvider()
4646
* @covers Flatten::flatten
4747
* @dataProvider scalarSeparatorPrefixProvider
4848
*/
49-
public function testFlattenScalarWithSeparatorAndPrefix($var, $separator, $prefix, $expectedOutput)
49+
public function testFlattenScalarWithSeparatorAndPrefix($input, $separator, $prefix, $expectedOutput)
5050
{
51-
$output = Flatten::flatten($var, $separator, $prefix);
51+
$output = $this->flattenToArray($input, $separator, $prefix);
5252

5353
$this->assertEquals($expectedOutput, $output);
5454
}
@@ -80,7 +80,7 @@ public function arraysProvider()
8080
*/
8181
public function testFlattenArrays($input, $expectedOutput)
8282
{
83-
$output = Flatten::flatten($input);
83+
$output = $this->flattenToArray($input);
8484

8585
$this->assertEquals($expectedOutput, $output);
8686
}
@@ -116,7 +116,7 @@ public function traversablesProvider()
116116
*/
117117
public function testFlattenTraversable($input, $expectedOutput)
118118
{
119-
$output = Flatten::flatten($input);
119+
$output = $this->flattenToArray($input);
120120
$this->assertEquals($expectedOutput, $output);
121121
}
122122

@@ -155,9 +155,9 @@ public function traversablesSeparatorPrefixProvider()
155155
* @covers Flatten::flatten
156156
* @dataProvider traversablesSeparatorPrefixProvider
157157
*/
158-
public function testFlattenTraversableWithSeparatorAndPrefix($var, $separator, $prefix, $expectedOutput)
158+
public function testFlattenTraversableWithSeparatorAndPrefix($input, $separator, $prefix, $expectedOutput)
159159
{
160-
$output = Flatten::flatten($var, $separator, $prefix);
160+
$output = $this->flattenToArray($input, $separator, $prefix);
161161
$this->assertEquals($expectedOutput, $output);
162162
}
163163

@@ -214,9 +214,18 @@ public function flattenWithFlagsProvidor()
214214
* @covers Flatten::flatten
215215
* @dataProvider flattenWithFlagsProvidor
216216
*/
217-
public function testFlattenWithFlags($var, $separator, $prefix, $flags, $expectedOutput)
217+
public function testFlattenWithFlags($input, $separator, $prefix, $flags, $expectedOutput)
218218
{
219-
$output = Flatten::flatten($var, $separator, $prefix, $flags);
219+
$output = $this->flattenToArray($input, $separator, $prefix, $flags);
220220
$this->assertEquals($expectedOutput, $output);
221221
}
222+
223+
private function flattenToArray(
224+
$input,
225+
$separator = Flatten::DEFAULT_SEPARATOR,
226+
$prefix = Flatten::DEFAULT_PREFIX,
227+
$flags = Flatten::DEFAULT_FLAGS
228+
) {
229+
return iterator_to_array((new Flatten($separator, $prefix, $flags))->flatten($input));
230+
}
222231
}

0 commit comments

Comments
 (0)