Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/ArrayHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -1210,7 +1210,7 @@ public static function isSubset(iterable $needles, iterable $haystack, bool $str
* ```
*
* @param array $array Source array
* @param array $filters Rules that define array keys which should be left or removed from results.
* @param list<string> $filters Rules that define array keys which should be left or removed from results.
* Each rule is:
* - `var` - `$array['var']` will be left in result.
* - `var.key` = only `$array['var']['key']` will be left in result.
Expand All @@ -1229,12 +1229,13 @@ public static function filter(array $array, array $filters): array
continue;
}

$nodeValue = $array; //set $array as root node
$nodeValue = $array; // set $array as root node
$keys = explode('.', $filter);
foreach ($keys as $key) {
if (!array_key_exists($key, $nodeValue)) {
continue 2; //Jump to next filter
if (!is_array($nodeValue) || !array_key_exists($key, $nodeValue)) {
continue 2; // Jump to next filter
}
/** @var mixed */
$nodeValue = $nodeValue[$key];
}

Expand All @@ -1246,23 +1247,25 @@ public static function filter(array $array, array $filters): array
}
$resultNode = &$resultNode[$key];
}
/** @var mixed */
$resultNode = $nodeValue;
}

/** @var array $result */

foreach ($excludeFilters as $filter) {
$excludeNode = &$result;
$keys = explode('.', $filter);
$numNestedKeys = count($keys) - 1;
foreach ($keys as $i => $key) {
if (!array_key_exists($key, $excludeNode)) {
continue 2; //Jump to next filter
if (!is_array($excludeNode) || !array_key_exists($key, $excludeNode)) {
continue 2; // Jump to next filter
}

if ($i < $numNestedKeys) {
/** @psalm-suppress EmptyArrayAccess */
/** @var mixed */
$excludeNode = &$excludeNode[$key];
} else {
/** @psalm-suppress EmptyArrayAccess */
unset($excludeNode[$key]);
break;
}
Expand Down
181 changes: 0 additions & 181 deletions tests/ArrayHelper/ArrayHelperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -233,187 +233,6 @@ public function testIsSubset(): void
$this->assertFalse(ArrayHelper::isSubset(new ArrayObject([1]), ['1', 'b'], true));
}

public function testFilter(): void
{
$array = [
'A' => [
'B' => 1,
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
'G' => 1,
];

// Include tests
$this->assertEquals(
[
'A' => [
'B' => 1,
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
],
ArrayHelper::filter($array, ['A'])
);

$this->assertEquals(
[
'A' => [
'B' => 1,
],
],
ArrayHelper::filter($array, ['A.B'])
);

$this->assertEquals(
[
'A' => [
'D' => [
'E' => 1,
'F' => 2,
],
],
],
ArrayHelper::filter($array, ['A.D'])
);

$this->assertEquals(
[
'A' => [
'D' => [
'E' => 1,
],
],
],
ArrayHelper::filter($array, ['A.D.E'])
);

$this->assertEquals(
[
'A' => [
'B' => 1,
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
'G' => 1,
],
ArrayHelper::filter($array, ['A', 'G'])
);

$this->assertEquals(
[
'A' => [
'D' => [
'E' => 1,
],
],
'G' => 1,
],
ArrayHelper::filter($array, ['A.D.E', 'G'])
);

// Exclude (combined with include) tests
$this->assertEquals(
[
'A' => [
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
],
ArrayHelper::filter($array, ['A', '!A.B'])
);

$this->assertEquals(
[
'A' => [
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
],
ArrayHelper::filter($array, ['!A.B', 'A'])
);

$this->assertEquals(
[
'A' => [
'B' => 1,
'C' => 2,
'D' => [
'F' => 2,
],
],
],
ArrayHelper::filter($array, ['A', '!A.D.E'])
);

$this->assertEquals(
[
'A' => [
'B' => 1,
'C' => 2,
],
],
ArrayHelper::filter($array, ['A', '!A.D'])
);

$this->assertEquals(
[
'G' => 1,
],
ArrayHelper::filter($array, ['G', '!X'])
);
}

public function testFilterNonExistingKeys(): void
{
$array = [
'A' => [
'B' => 1,
'C' => 2,
'D' => [
'E' => 1,
'F' => 2,
],
],
'G' => 1,
];

$this->assertEquals([], ArrayHelper::filter($array, ['X']));
$this->assertEquals([], ArrayHelper::filter($array, ['X.Y']));
$this->assertEquals([], ArrayHelper::filter($array, ['A.X']));
}

/**
* Values that evaluate to `true` with `empty()` tests
*/
public function testFilterEvaluatedToEmpty(): void
{
$input = [
'a' => 0,
'b' => '',
'c' => false,
'd' => null,
'e' => true,
];

$this->assertEquals(ArrayHelper::filter($input, array_keys($input)), $input);
}

public function testGetObjectVars()
{
$this->assertSame([
Expand Down
Loading