Как получить определенные ключ/значения из вторичного массива для поддержки моего процесса array_filter

Следующее отлично подходит для фильтрации моего многомерного массива до элементов, на которых я хочу сосредоточиться...

$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 есть много встроенных функций для работы с строками, массивами и файлами.


55
2

Ответы:

Самое простое решение:

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>';