Skip to content

Commit 091fbf1

Browse files
committed
Merger
1 parent 4235346 commit 091fbf1

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed

src/Merger.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Contributte\Utils;
4+
5+
class Merger
6+
{
7+
8+
/**
9+
* @param mixed $left
10+
* @param mixed $right
11+
* @return mixed
12+
*/
13+
public static function merge($left, $right)
14+
{
15+
if (is_array($left) && is_array($right)) {
16+
foreach ($left as $key => $val) {
17+
if (is_int($key)) {
18+
$right[] = $val;
19+
} else {
20+
if (isset($right[$key])) {
21+
$val = self::merge($val, $right[$key]);
22+
}
23+
24+
$right[$key] = $val;
25+
}
26+
}
27+
28+
return $right;
29+
}
30+
31+
if ($left === null && is_array($right)) {
32+
return $right;
33+
}
34+
35+
return $left;
36+
}
37+
38+
}

tests/Unit/Merger.phpt

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Contributte\Utils\Merger;
4+
use Tester\Assert;
5+
6+
require_once __DIR__ . '/../bootstrap.php';
7+
8+
test(function (): void {
9+
$right = [
10+
'default' => 'default',
11+
'overriden' => 'not-overriden',
12+
'merged' => [
13+
'foo' => 'foo',
14+
'bar' => 'bar',
15+
'baz' => 'baz',
16+
],
17+
];
18+
19+
$left = [
20+
'overriden' => 'overriden',
21+
'new' => 'new',
22+
'merged' => [
23+
'baz' => 'foo',
24+
],
25+
];
26+
27+
$expected = [
28+
'default' => 'default',
29+
'overriden' => 'overriden',
30+
'merged' => [
31+
'foo' => 'foo',
32+
'bar' => 'bar',
33+
'baz' => 'foo',
34+
],
35+
'new' => 'new',
36+
];
37+
38+
$merged = Merger::merge($left, $right);
39+
Assert::same($expected, $merged);
40+
});
41+
42+
test(function (): void {
43+
$left = [
44+
0 => 'zero left',
45+
'one' => 'one left',
46+
2 => 'two left',
47+
'3' => 'three left',
48+
];
49+
50+
$right = [
51+
2 => 'two right',
52+
'3' => 'three right',
53+
4 => 'four right',
54+
];
55+
56+
$expected = [
57+
2 => 'two right',
58+
'3' => 'three right',
59+
4 => 'four right',
60+
5 => 'zero left',
61+
'one' => 'one left',
62+
6 => 'two left',
63+
7 => 'three left',
64+
];
65+
66+
Assert::same($expected, Merger::merge($left, $right));
67+
});
68+
69+
test(function (): void {
70+
$left = 10;
71+
$right = 20;
72+
Assert::same(10, Merger::merge($left, $right));
73+
});
74+
75+
test(function (): void {
76+
$left = ['foo' => 'bar'];
77+
$right = 10;
78+
Assert::same(['foo' => 'bar'], Merger::merge($left, $right));
79+
});
80+
81+
test(function (): void {
82+
$left = 10;
83+
$right = ['foo' => 'bar'];
84+
Assert::same(10, Merger::merge($left, $right));
85+
86+
$left = null;
87+
$right = ['foo' => 'bar'];
88+
Assert::same(['foo' => 'bar'], Merger::merge($left, $right));
89+
});

0 commit comments

Comments
 (0)