Skip to content

Commit 21a8364

Browse files
refactoring
1 parent a864e56 commit 21a8364

File tree

8 files changed

+87
-13
lines changed

8 files changed

+87
-13
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"src/Expand.php",
4040
"src/First.php",
4141
"src/Flatten.php",
42+
"src/Has.php",
4243
"src/IndexOf.php",
4344
"src/Map.php",
4445
"src/None.php",

src/Add.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@
99
* This function uses strict comparison to determine if element exists
1010
*
1111
* @param array $set The collection
12+
* @param mixed $element Element to be added
1213
* @param mixed ...$elements Elements to be added
1314
* @return int The number of items added to the collection
1415
*/
15-
function add(array &$set, ...$elements): int
16+
function add(array &$set, $element, ...$elements): int
1617
{
1718
$added = 0;
19+
array_unshift($elements, $element);
1820
foreach ($elements as $element) {
1921
if (! in_array($element, $set, true)) {
2022
$set[] = $element;

src/Has.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace BrenoRoosevelt;
5+
6+
/**
7+
* Determine if all given keys are present in the haystack.
8+
*
9+
* @param array $haystack The collection
10+
* @param string|int $key keys be to checked
11+
* @param string|int ...$keys keys be to checked
12+
* @return bool
13+
*/
14+
function has(array $haystack, $key, ...$keys): bool
15+
{
16+
$keys[] = $key;
17+
return ! array_diff($keys, array_keys($haystack));
18+
}

src/Remove.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
* remove($set, 1, 3) will return 3 (int) and $set will contain [2, 4]
1212
*
1313
* @param array $set The collection
14+
* @param mixed $element Element to be removed
1415
* @param mixed ...$elements Elements to be removed
1516
* @return int The number of removed elements
1617
*/
17-
function remove(array &$set, ...$elements): int
18+
function remove(array &$set, $element, ...$elements): int
1819
{
1920
$removed = 0;
21+
$elements[] = $element;
2022
foreach ($elements as $element) {
2123
foreach (array_keys($set, $element, true) as $index) {
2224
unset($set[$index]);

src/RemoveKey.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
* Remove elements by keys
88
*
99
* @param array $set The collection
10+
* @param string|int $key The key to be removed
1011
* @param string|int ...$keys The keys to be removed
1112
* @return int The number of removed elements
1213
*/
13-
function remove_key(array &$set, ...$keys): int
14+
function remove_key(array &$set, $key, ...$keys): int
1415
{
1516
$removed = 0;
17+
$keys[] = $key;
1618
foreach ($keys as $key) {
1719
if (array_key_exists($key, $set)) {
1820
unset($set[$key]);

src/array_functions.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33

44
namespace BrenoRoosevelt;
55

6-
function has(array $items, ...$keys): bool
7-
{
8-
return ! array_diff($keys, array_keys($items));
9-
}
10-
116
function only(array $items, ...$keys): array
127
{
138
return array_intersect_key($items, array_flip($keys));

tests/AddTest.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@ public function addProvider(): array
2626
['d', 'd', 'a', 'c'],
2727
['a', 'b', 'c', 'd'],
2828
],
29-
'case_4' => [
30-
['a', 'b', 'c'],
31-
[],
32-
['a', 'b', 'c'],
33-
],
3429
'case_5' => [
3530
['x' => 'a', 'y' => 'b', 'c'],
3631
['x', 'y', 'a', 'b', 'b'],

tests/HasTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace BrenoRoosevelt\Tests;
5+
6+
use PHPUnit\Framework\TestCase;
7+
use function BrenoRoosevelt\has;
8+
9+
class HasTest extends TestCase
10+
{
11+
public function hasKeyProvider(): array
12+
{
13+
return [
14+
'case_1' => [
15+
[0, 1, 2], // haystack
16+
[0], // keys
17+
true // expected
18+
],
19+
'case_2' => [
20+
[0, 1, 2], // haystack
21+
[1, 2], // keys
22+
true // expected
23+
],
24+
'case_3' => [
25+
['a' => 0, 'b' => 1, 2], // haystack
26+
[0], // keys
27+
true // expected
28+
],
29+
'case_4' => [
30+
['a' => 0, 'b' => 1, 2], // haystack
31+
[1], // keys
32+
false // expected
33+
],
34+
'case_5' => [
35+
['a' => 0, 'b' => 1, 2], // haystack
36+
['a', 'b', 8], // keys
37+
false // expected
38+
],
39+
'case_6' => [
40+
[], // haystack
41+
[0], // keys
42+
false // expected
43+
]
44+
];
45+
}
46+
47+
/**
48+
* @param array $haystack
49+
* @param array $keys
50+
* @param bool $expected
51+
* @return void
52+
* @dataProvider hasKeyProvider
53+
*/
54+
public function testHasKey(array $haystack, array $keys, bool $expected): void
55+
{
56+
$actual = has($haystack, ...$keys);
57+
$this->assertEquals($expected, $actual);
58+
}
59+
}

0 commit comments

Comments
 (0)