Skip to content

Commit 286d9a0

Browse files
authored
fix(support): make Arr\forget_values and Arr\forget_keys mutable (#1215)
1 parent 1f3ec14 commit 286d9a0

File tree

2 files changed

+80
-5
lines changed

2 files changed

+80
-5
lines changed

packages/support/src/Arr/functions.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,13 @@ function shuffle(iterable $array): array
138138
*/
139139
function remove_keys(iterable $array, string|int|array $keys): array
140140
{
141-
return namespace\forget_keys(to_array($array), $keys);
141+
$array = to_array($array);
142+
143+
return namespace\forget_keys($array, $keys);
142144
}
143145

144146
/**
145-
* Removes the specified values from the array. The array is mutated.
147+
* Removes the specified values from the array. The array is not mutated.
146148
*
147149
* @template TKey of array-key
148150
* @template TValue
@@ -153,7 +155,9 @@ function remove_keys(iterable $array, string|int|array $keys): array
153155
*/
154156
function remove_values(array $array, string|int|array $values): array
155157
{
156-
return namespace\forget_values(to_array($array), $values);
158+
$array = to_array($array);
159+
160+
return namespace\forget_values($array, $values);
157161
}
158162

159163
/**
@@ -166,7 +170,7 @@ function remove_values(array $array, string|int|array $values): array
166170
* @param array-key|array<array-key> $keys The keys of the items to remove.
167171
* @return array<TKey,TValue>
168172
*/
169-
function forget_keys(array $array, string|int|array $keys): array
173+
function forget_keys(array &$array, string|int|array $keys): array
170174
{
171175
$keys = is_array($keys) ? $keys : [$keys];
172176

@@ -187,7 +191,7 @@ function forget_keys(array $array, string|int|array $keys): array
187191
* @param TValue|array<TValue> $values The values to remove.
188192
* @return array<TKey,TValue>
189193
*/
190-
function forget_values(array $array, string|int|array $values): array
194+
function forget_values(array &$array, string|int|array $values): array
191195
{
192196
$values = is_array($values) ? $values : [$values];
193197

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace Tempest\Support\Tests\Arr;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Tempest\Support\Arr;
7+
8+
final class FunctionsTest extends TestCase
9+
{
10+
public function test_forget_values_mutates_array(): void
11+
{
12+
$original = [
13+
'foo',
14+
'bar',
15+
];
16+
17+
Arr\forget_values($original, ['foo']);
18+
19+
$this->assertCount(1, $original);
20+
$this->assertContains('bar', $original);
21+
}
22+
23+
public function test_remove_values_does_not_mutate_array(): void
24+
{
25+
$original = [
26+
'foo',
27+
'bar',
28+
];
29+
30+
$result = Arr\remove_values($original, ['foo']);
31+
32+
$this->assertCount(2, $original);
33+
$this->assertContains('foo', $original);
34+
$this->assertContains('bar', $original);
35+
36+
$this->assertCount(1, $result);
37+
$this->assertContains('bar', $result);
38+
}
39+
40+
public function test_forget_keys_mutates_array(): void
41+
{
42+
$original = [
43+
'foo' => 'bar',
44+
'baz' => 'qux',
45+
];
46+
47+
Arr\forget_keys($original, ['foo']);
48+
49+
$this->assertCount(1, $original);
50+
$this->assertArrayNotHasKey('foo', $original);
51+
$this->assertArrayHasKey('baz', $original);
52+
}
53+
54+
public function test_remove_keys_does_not_mutate_array(): void
55+
{
56+
$original = [
57+
'foo' => 'bar',
58+
'baz' => 'qux',
59+
];
60+
61+
$result = Arr\remove_keys($original, ['foo']);
62+
63+
$this->assertCount(2, $original);
64+
$this->assertArrayHasKey('foo', $original);
65+
$this->assertArrayHasKey('baz', $original);
66+
67+
$this->assertCount(1, $result);
68+
$this->assertArrayNotHasKey('foo', $result);
69+
$this->assertArrayHasKey('baz', $result);
70+
}
71+
}

0 commit comments

Comments
 (0)