dr.Brain

doctor Brain

мир глазами веб-разработчика

PHP: фильтрация массивов

фильтруем многомерный массив по ключу и значению

dr.Brain

время чтения 5 мин.

Photo by Amy Baugess on Unsplash

К счастью, функция array_filter не ограничена только возможностью удалять из массива значения, соответствующие логическому false. В качестве второго параметра array_filter может использовать весьма полезные callback-функции, а это означает, что мы можем делать с массивом, практически все, что захотим.

Давайте рассмотрим возможность фильтрации многомерного массива по ключу и значению.

Исходный массив

Для начала, нам нужны какие-то данные, например, этот небольшой многомерный массив:

$array["PHPDevelopers"] = [
    ["Name" => 'Dan Englishby', 'Age' => '99', 'DeveloperLevel' => '3', 'Email' => 'dan@englishby.com', 'Gender' => 'Male'],
    ["Name" => 'Del Smith', 'Age' => '33', 'DeveloperLevel' => '8', 'Email' => 'del@smith.com', 'Gender' => 'Male'],
    ["Name" => 'Jame Raphael', 'Age' => '27', 'DeveloperLevel' => '4', 'Email' => 'jame@raphael.com', 'Gender' => 'Male'],
    ["Name" => 'Jayna Honaker', 'Age' => '42', 'DeveloperLevel' => '9', 'Email' => 'jame@raphael.com', 'Gender' => 'Female'],
    ["Name" => 'Stephine Ransome', 'Age' => '42', 'DeveloperLevel' => '4', 'Email' => 'stephine@ransome.com', 'Gender' => 'Female'],
];
$array["C#Developers"] = [
    ["Name" => 'Craig Woolard', 'Age' => '22', 'DeveloperLevel' => '4', 'Email' => 'craig@woolard.com', 'Gender' => 'Male'],
    ["Name" => 'Tiffiny Minich', 'Age' => '21', 'DeveloperLevel' => '3', 'Email' => 'tiffiny@minich.com', 'Gender' => 'Female'],
    ["Name" => 'Chad Lanser', 'Age' => '55', 'DeveloperLevel' => '7', 'Email' => 'chad@lanser.com', 'Gender' => 'Male'],
    ["Name" => 'Latisha Langlais', 'Age' => '25', 'DeveloperLevel' => '2', 'Email' => 'latisha@langlais.com', 'Gender' => 'Female'],
    ["Name" => 'Dave Gaona', 'Age' => '63', 'DeveloperLevel' => '9', 'Email' => 'dave@gaona.com', 'Gender' => 'Male'],
];

Конечно, для лучшего представления данных пригодится функция var_dump:

array (
  'PHPDevelopers' => 
  array (
    0 => 
    array (
      'Name' => 'Dan Englishby',
      'Age' => '99',
      'DeveloperLevel' => '3',
      'Email' => 'dan@englishby.com',
      'Gender' => 'Male',
    ),
    1 => 
    array (
      'Name' => 'Del Smith',
      'Age' => '33',
      'DeveloperLevel' => '8',
      'Email' => 'del@smith.com',
      'Gender' => 'Male',
    ),
    2 => 
    array (
      'Name' => 'Jame Raphael',
      'Age' => '27',
      'DeveloperLevel' => '4',
      'Email' => 'jame@raphael.com',
      'Gender' => 'Male',
    ),
    3 => 
    array (
      'Name' => 'Jayna Honaker',
      'Age' => '42',
      'DeveloperLevel' => '9',
      'Email' => 'jame@raphael.com',
      'Gender' => 'Female',
    ),
    4 => 
    array (
      'Name' => 'Stephine Ransome',
      'Age' => '42',
      'DeveloperLevel' => '4',
      'Email' => 'stephine@ransome.com',
      'Gender' => 'Female',
    ),
  ),
  'C#Developers' => 
  array (
    0 => 
    array (
      'Name' => 'Craig Woolard',
      'Age' => '22',
      'DeveloperLevel' => '4',
      'Email' => 'craig@woolard.com',
      'Gender' => 'Male',
    ),
    1 => 
    array (
      'Name' => 'Tiffiny Minich',
      'Age' => '21',
      'DeveloperLevel' => '3',
      'Email' => 'tiffiny@minich.com',
      'Gender' => 'Female',
    ),
    2 => 
    array (
      'Name' => 'Chad Lanser',
      'Age' => '55',
      'DeveloperLevel' => '7',
      'Email' => 'chad@lanser.com',
      'Gender' => 'Male',
    ),
    3 => 
    array (
      'Name' => 'Latisha Langlais',
      'Age' => '25',
      'DeveloperLevel' => '2',
      'Email' => 'latisha@langlais.com',
      'Gender' => 'Female',
    ),
    4 => 
    array (
      'Name' => 'Dave Gaona',
      'Age' => '63',
      'DeveloperLevel' => '9',
      'Email' => 'dave@gaona.com',
      'Gender' => 'Male',
    ),
  ),
);

Фильтрация многомерного массива по ключу

Теперь попробуем отфильтровать массив по ключу (key). Напомню, что в нашем массиве есть два главных ключа: ‘PHPDevelopers’ и ‘C#Developers’. Давайте предположим, что нам требуются только данные для ‘PHPDevelopers’.

По умолчанию функция array_filter возвращает только значения. С помощью третьего параметра мы можем явно указать, что нам требуются только ключи (ARRAY_FILTER_USE_KEY) или и ключи и значения (ARRAY_FILTER_USE_BOTH).

Вот так будет выглядеть наша функция:

$phpDevs = array_filter($array, function ($key) {
    return $key == 'PHPDevelopers';
}, ARRAY_FILTER_USE_KEY); // так же можно использовать флаг ARRAY_FILTER_USE_BOTH.

А это результат:

array (
  'PHPDevelopers' => 
  array (
    0 => 
    array (
      'Name' => 'Dan Englishby',
      'Age' => '99',
      'DeveloperLevel' => '3',
      'Email' => 'dan@englishby.com',
      'Gender' => 'Male',
    ),
    1 => 
    array (
      'Name' => 'Del Smith',
      'Age' => '33',
      'DeveloperLevel' => '8',
      'Email' => 'del@smith.com',
    ),
    'Gender' => 'Female',
    2 => 
    array (
      'Name' => 'Jame Raphael',
      'Age' => '27',
      'DeveloperLevel' => '4',
      'Email' => 'jame@raphael.com',
    ),
    3 => 
    array (
      'Name' => 'Jayna Honaker',
      'Age' => '42',
      'DeveloperLevel' => '9',
      'Email' => 'jame@raphael.com',
    ),
    4 => 
    array (
      'Name' => 'Stephine Ransome',
      'Age' => '42',
      'DeveloperLevel' => '4',
      'Email' => 'stephine@ransome.com',
      'Gender' => 'Female',
    ),
  ),
);

Давайте посмотрим, что произойдет, если мы забудем указать третий параметр для array_filter:

$phpDevs = array_filter($array, function ($key) {
    return $key == 'PHPDevelopers';
});

Результат:

array (
);

Фильтрация многомерного массива по значению

А теперь попробуем отфильтровать в массиве php-разработчиков (PHP Developers) старше сорока лет.

Обратите внимание на следующие моменты:

  1. $value - это каждый массив в составе PHPDevelopers,
  2. для того, чтобы иметь возможность обратиться к переменной за пределами области видимости аноноимной callback-функции, мы используем оператор use,
  3. мы отбираем только php-разработчиков, явно указав ключ PHPDevelopers для первого параметра функции array_filter.

Получится следующая функция:

$age = 40;

$phpDevsOver40 = array_filter($array["PHPDevelopers"], function ($value) use ($age) {
    return ($value["Age"] > $age);
});

Итак, мы отобрали три записи, в каждой из которых возраст разработчика превышает 40 лет:

array (
  0 => 
  array (
    'Name' => 'Dan Englishby',
    'Age' => '99',
    'DeveloperLevel' => '3',
    'Email' => 'dan@englishby.com',
    'Gender' => 'Male',
  ),
  3 => 
  array (
    'Name' => 'Jayna Honaker',
    'Age' => '42',
    'DeveloperLevel' => '9',
    'Email' => 'jame@raphael.com',
    'Gender' => 'Female',
  ),
  4 => 
  array (
    'Name' => 'Stephine Ransome',
    'Age' => '42',
    'DeveloperLevel' => '4',
    'Email' => 'stephine@ransome.com',
    'Gender' => 'Female',
  ),
);

Вывод

Функция array_filter дает практически неограниченные возможности, например: для простого отбора данных в большом массиве или для фильтрации свойств выбранных в интернет-магазине товаров.

Не забывайте изучить полную документацию для array_filter.


Спасибо за внимание.


Перевод статьи Dan Englishby “PHP Filter Multidimensional Array By Key Or Value”.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.