PHP: фильтрация массивов
фильтруем многомерный массив по ключу и значению
К счастью, функция 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) старше сорока лет.
Обратите внимание на следующие моменты:
- $value - это каждый массив в составе PHPDevelopers,
- для того, чтобы иметь возможность обратиться к переменной за пределами области видимости аноноимной callback-функции, мы используем оператор use,
- мы отбираем только 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”.