Как получить определенные ключ/значения из вторичного массива для поддержки моего процесса 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.

Возможно ли это?

1. Переберите массив из второго примера и создайте коллекцию stringid. 2. Используйте in_array() в своем сказуемом array_filter.

zerkms 23.08.2024 00:49

Вы не можете использовать ->stringid для доступа к элементам массива, то есть для доступа к свойствам объекта. Вам нужно использовать ['stringid']

Barmar 23.08.2024 00:50

ух ты! большое спасибо - попробую

klewis 23.08.2024 00:50

Бармер, вы абсолютно правы, и я обязательно преобразую свой объект в массив с правильным синтаксисом.

klewis 23.08.2024 00:51

Я думал, у тебя уже есть массив. Это то, что вы показываете в своем вопросе.

Barmar 23.08.2024 00:52

Должно быть $data['contactList']['stringid']

Barmar 23.08.2024 00:52

Или $data->contactList->stringid если это на самом деле объекты.

Barmar 23.08.2024 00:53

['contactList'] не является ключом в $mAllLists. Это только часть вторичного массива, который я разместил ниже.

klewis 23.08.2024 00:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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>';
   

Другие вопросы по теме