I have an multidimensional array and i'd like to filter by many values.
$datas = [
[
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
'gender' => 'male'
],
[
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
'gender' => 'female'
],
[
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Doe',
'gender' => 'female'
],
[
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
'gender' => 'male'
],
[
'id' => 7216,
'first_name' => 'Mike',
'last_name' => 'Lill',
'gender' => 'male'
]
];
I have combined the methods of array_filter
and array_search
and got a good result but this only does the filtering of only one value. I'd like something like this...
array_filter(
$datas,
function ($key) {
return array_search(['Doe', 'male'...], $key);
});
And its give
array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
'gender' => 'male'
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
'gender' => 'male'
)
)
Of course you can simply loop any given input and check if a given element matches any criteria you implement:
<?php
$input = [
[
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
'gender' => 'male'
],
[
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
'gender' => 'female'
],
[
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Doe',
'gender' => 'female'
],
[
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
'gender' => 'male'
],
[
'id' => 7216,
'first_name' => 'Mike',
'last_name' => 'Lill',
'gender' => 'male'
]
];
$needles = ['Doe', 'male'];
$output = [];
array_walk($input, function($element) use ($needles, &$output) {
$matches = true;
foreach ($needles as $needle) {
if (!in_array($needle, $element)) {
$matches = false;
}
}
if ($matches) {
$output[] = $element;
}
});
print_r($output);
The obvious output is:
Array
(
[0] => Array
(
[id] => 2135
[first_name] => John
[last_name] => Doe
[gender] => male
)
[1] => Array
(
[id] => 5623
[first_name] => Peter
[last_name] => Doe
[gender] => male
)
)