Следующее отлично подходит для фильтрации моего многомерного массива до элементов, на которых я хочу сосредоточиться...
$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.
Возможно ли это?
Вы не можете использовать ->stringid для доступа к элементам массива, то есть для доступа к свойствам объекта. Вам нужно использовать ['stringid']
ух ты! большое спасибо - попробую
Бармер, вы абсолютно правы, и я обязательно преобразую свой объект в массив с правильным синтаксисом.
Я думал, у тебя уже есть массив. Это то, что вы показываете в своем вопросе.
Должно быть $data['contactList']['stringid']
Или $data->contactList->stringid если это на самом деле объекты.
['contactList'] не является ключом в $mAllLists. Это только часть вторичного массива, который я разместил ниже.






Самое простое решение:
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>';
1. Переберите массив из второго примера и создайте коллекцию
stringid. 2. Используйтеin_array()в своем сказуемомarray_filter.