Следующее отлично подходит для фильтрации моего многомерного массива до элементов, на которых я хочу сосредоточиться...
$mAllLists = []; //my big array
$mFilteredLists = array_filter($mAllLists, function ($data)
{
return $data['stringid'] == "dog" || $data['stringid'] == 'people'
|| $data['stringid'] == 'house' || $data['stringid'] == 'cat';
});
Но возможно ли с помощью array_filter заменить $data реальным массивом, имеющим ключи, которые мы хотим сопоставить? или есть ли лучшая функция PHP для такого рода процессов?
Например, если бы у меня был массив, который выглядит так...
array (
0 =>
array (
'contactList' =>
array (
'stringid' => 'dog',
'status' => '1',
'sourceid' => '0',
),
),
1 =>
array (
'contactList' =>
array (
'stringid' => 'people',
'status' => '1',
'sourceid' => '0',
),
),
)
Я хотел бы использовать ключи stringid вместо жесткого кодирования значений $data для моего возврата в $mFilteredLists.
Возможно ли это?
🤔 А знаете ли вы, что...
В PHP есть много встроенных функций для работы с строками, массивами и файлами.
Самое простое решение:
const VALID_IDS = ['dog', 'people', 'house'];
$mFilteredLists = array_filter($mAllLists, function ($data)
{
return in_array($data['stringid'], VALID_IDS);
});
Хотя in_array
работает несколько медленно, альтернативный метод:
const VALID_IDS = ['dog'=>1, 'people'=>1, 'house'=>1];
$mFilteredLists = array_filter($mAllLists, function ($data)
{
return isset(VALID_IDS[$data['stringid']]);
});
Если VALID_IDS
должна быть переменной:
$VALID_IDS = ['dog', 'people', 'house'];
$VALID_IDS = array_flip($VALID_IDS);
$mFilteredLists = array_filter($mAllLists,
fn ($data) => isset($VALID_IDS[$data['stringid']]));
После некоторых глубоких исследований и тестирования я пришел к выводу, что мне было бы полезно переименовать эту тему в «Как фильтровать многомерный массив по нескольким ключам/значениям другого массива».
При этом я нашел array_walk с обратным вызовом, полезным для моей цели. следующий пример полностью подводит меня к моей цели...
$myListDetails = []; //my multidemensional array holding all data....
$allowed = [array(array('stringid' => 'cat'), array('stringid' => 'dog'))];
$output = [];
array_walk($myListDetails, function ($element) use ($allowed, &$output)
{
$matches = true;
foreach ($allowed as $allow)
{
foreach ($allow as $subval)
{
if (!in_array($subval, $element))
{
$matches = false;
}
else
{
$output[] = $element;
}
}
}
});
//displays a new array of my desired elements
echo '<pre>' . var_export($ouput, true) . '</pre>';