Add Array function to return only array entries based on matching key
A simple key based array filter
This commit is contained in:
@@ -1201,6 +1201,91 @@ final class CoreLibsCombinedArrayHandlerTest extends TestCase
|
|||||||
'Find next key in array'
|
'Find next key in array'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function providerReturnMatchingKeyOnley(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'limited entries' => [
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'a', 'b'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'limited entries, with one wrong key' => [
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'a', 'b', 'f'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'wrong keys only' => [
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'f', 'f'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'empty keys' => [
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar'
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
'a' => 'foo',
|
||||||
|
'b' => 'bar',
|
||||||
|
'c' => 'foobar'
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented function
|
||||||
|
*
|
||||||
|
* @covers ::arrayReturnMatchingKeyOnly
|
||||||
|
* @dataProvider providerReturnMatchingKeyOnley
|
||||||
|
* @testdox arrayReturnMatchingKeyOnly get only selected key entries from array [$_dataName]
|
||||||
|
*
|
||||||
|
* @param array $input
|
||||||
|
* @param array $key_list
|
||||||
|
* @param array $expected
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArrayReturnMatchingKeyOnly(
|
||||||
|
array $input,
|
||||||
|
array $key_list,
|
||||||
|
array $expected
|
||||||
|
): void {
|
||||||
|
$this->assertEquals(
|
||||||
|
$expected,
|
||||||
|
\CoreLibs\Combined\ArrayHandler::arrayReturnMatchingKeyOnly(
|
||||||
|
$input,
|
||||||
|
$key_list
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -250,6 +250,19 @@ foreach (array_keys($array) as $search) {
|
|||||||
}
|
}
|
||||||
print "Key not exists: " . DgS::printAr(ArrayHandler::arrayGetNextKey($array, 'z')) . "<br>";
|
print "Key not exists: " . DgS::printAr(ArrayHandler::arrayGetNextKey($array, 'z')) . "<br>";
|
||||||
|
|
||||||
|
print "<hr>";
|
||||||
|
$keys = ['b', 'c', 'f'];
|
||||||
|
print "Return only: " . DgS::printAr($keys) . ": "
|
||||||
|
. DgS::printAr(ArrayHandler::arrayReturnMatchingKeyOnly($array, $keys)) . "<br>";
|
||||||
|
|
||||||
|
$out = array_filter($array, fn($key) => in_array($key, $keys), ARRAY_FILTER_USE_KEY);
|
||||||
|
print "array filter: " . DgS::printAr($keys) . ": " . DgS::printAr($out) . "<br>";
|
||||||
|
$out = array_intersect_key(
|
||||||
|
$array,
|
||||||
|
array_flip($keys)
|
||||||
|
);
|
||||||
|
print "array intersect key: " . DgS::printAr($keys) . ": " . DgS::printAr($out) . "<br>";
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -525,6 +525,30 @@ class ArrayHandler
|
|||||||
{
|
{
|
||||||
return array_diff($array, $remove);
|
return array_diff($array, $remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From the array with key -> anything values return only the matching entries from key list
|
||||||
|
* key list is a list[string]
|
||||||
|
* if key list is empty, return array as is
|
||||||
|
*
|
||||||
|
* @param array<string,mixed> $array
|
||||||
|
* @param array<string> $key_list
|
||||||
|
* @return array<string,mixed>
|
||||||
|
*/
|
||||||
|
public static function arrayReturnMatchingKeyOnly(
|
||||||
|
array $array,
|
||||||
|
array $key_list
|
||||||
|
): array {
|
||||||
|
// on empty return as is
|
||||||
|
if (empty($key_list)) {
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
return array_filter(
|
||||||
|
$array,
|
||||||
|
fn($key) => in_array($key, $key_list),
|
||||||
|
ARRAY_FILTER_USE_KEY
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
Reference in New Issue
Block a user