Php фильтрация многомерного массива

array_filter

Обходит каждое значение массива array , передавая его в callback -функцию. Если callback -функция возвращает true, данное значение из array возвращается в результирующий массив. Ключи массива сохраняются.

Список параметров

Если callback -функция не передана, все значения массива array равные FALSE (см. преобразование в булевый тип) будут удалены.

  • ARRAY_FILTER_USE_KEY — передавать только ключ массива как аргумент для callback вместо значения
  • ARRAY_FILTER_USE_BOTH — передавать и ключ и значение в callback вместо только значения

Возвращаемые значения

Возвращает отфильтрованный массив.

Список изменений

Версия Описание
5.6.0 Добавлен необязательный параметр flag и константы ARRAY_FILTER_USE_KEY и ARRAY_FILTER_USE_BOTH

Примеры

Пример #1 Пример использования array_filter()

function odd ( $var )
// является ли переданное число нечетным
return( $var & 1 );
>

function even ( $var )
// является ли переданное число четным
return(!( $var & 1 ));
>

$array1 = array( «a» => 1 , «b» => 2 , «c» => 3 , «d» => 4 , «e» => 5 );
$array2 = array( 6 , 7 , 8 , 9 , 10 , 11 , 12 );

echo «Нечетные:\n» ;
print_r ( array_filter ( $array1 , «odd» ));
echo «Четные:\n» ;
print_r ( array_filter ( $array2 , «even» ));
?>

Результат выполнения данного примера:

Нечетные: Array ( [a] => 1 [c] => 3 [e] => 5 ) Четные: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )

Пример #2 Использование array_filter() без callback -функции

$entry = array(
0 => ‘foo’ ,
1 => false ,
2 => — 1 ,
3 => null ,
4 => »
);

print_r ( array_filter ( $entry ));
?>

Результат выполнения данного примера:

Пример #3 array_filter() с указанным flag

$arr = [ ‘a’ => 1 , ‘b’ => 2 , ‘c’ => 3 , ‘d’ => 4 ];

var_dump ( array_filter ( $arr , function( $k ) return $k == ‘b’ ;
>, ARRAY_FILTER_USE_KEY ));

var_dump ( array_filter ( $arr , function( $v , $k ) return $k == ‘b’ || $v == 4 ;
>, ARRAY_FILTER_USE_BOTH ));
?>

Результат выполнения данного примера:

array(1) < ["b"]=>int(2) > array(2) < ["b"]=>int(2) ["d"]=> int(4) >

Примечания

Если callback-функция изменяет массив (например, добавляет или удаляет элементы), поведение этой функции неопределено.

Смотрите также

  • array_map() — Применяет callback-функцию ко всем элементам указанных массивов
  • array_reduce() — Итеративно уменьшает массив к единственному значению, используя callback-функцию
  • array_walk() — Применяет заданную пользователем функцию к каждому элементу массива

Источник

doctor Brain

К счастью, функция 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'; >); 

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

А теперь попробуем отфильтровать в массиве 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.

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

Photo by CHUTTERSNAP on Unsplash

JavaScript: сохраняем страницу в pdf

HTML: Полезные примеры

CSS: Ускоряем загрузку страницы

JavaScript: 5 странностей

JavaScript: конструктор сортировщиков

Категории

О нас

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

© 2021 dr.Brain .
мир глазами веб-разработчика

Источник

How to Filter Multidimensional Array by Key Value in PHP

Hi! In today’s post, let’s see how to filter multidimensional array by key value in php. PHP offers extensive functions to manipulate arrays of which array_filter makes the unimaginable possible. The function allows you to filter elements of an array with custom callbacks.

Multi-dimensional arrays are complicated enough but filtering them by key value is a headache because you have to iterate over each element and look for the specific key values to filter it. But PHP’s array_filter() function provides a short and simple way to filter multidimensional array by key and value. You have to use the appropriate callback filter and the rest is cake walk.

php filter multidimensional array by key value

PHP — Filtering Multidimensional Array by Key Value:

Before we start the process, a little intro about the function array_filter() .

It let you to filter array by value using custom callback. It takes up three parameters, 1. the source, 2. callback function that acts as the conditional filter and 3. flag to define whether a key, value or both should be used for filtering.

Consider the following multi-dimensional array,

Array ( [0] => Array ( [name] => John [email] => john@mydomain.com [dept] => Finance ) [1] => Array ( [name] => Lilly [email] => lilly@mydomain.com [dept] => Sales ) [2] => Array ( [name] => Austin [email] => austin@mydomain.com [dept] => HR ) [3] => Array ( [name] => Whites [email] => whites@mydomain.com [dept] => Finance ) [4] => Array ( [name] => Milan [email] => milan@mydomain.com [dept] => Sales ) )

Now let’s see how to filter this array so that the result only contains the elements that have their ‘dept => Sales’. Here ‘dept’ is the key and ‘Sales’ is the value.

"John", "email"=>"john@mydomain.com", "dept"=>"Finance"), array("name"=>"Lilly", "email"=>"lilly@mydomain.com", "dept"=>"Sales"), array("name"=>"Austin", "email"=>"austin@mydomain.com", "dept"=>"HR"), array("name"=>"Whites", "email"=>"whites@mydomain.com", "dept"=>"Finance"), array("name"=>"Milan", "email"=>"milan@mydomain.com", "dept"=>"Sales") ); $filter = "Sales"; $new_array = array_filter($myarray, function($var) use ($filter)< return ($var['dept'] == $filter); >); echo "
"; print_r($new_array); ?>

Above code will produce the following output,

Output:

Array ( [1] => Array ( [name] => Lilly [email] => lilly@mydomain.com [dept] => Sales ) [4] => Array ( [name] => Milan [email] => milan@mydomain.com [dept] => Sales ) )

Please note that we are filtering multi-dimensional array which is an array or arrays. So, here each element is itself another array. What the function did is, check each array against the given condition, and keep it in the result if it passes through the condition else remove it.

Filtering Array by Mutiple Key Values:

In the previous example, we have used a single conditional filter, but you can also filter it by multiple values.

Consider the following example,

"John", "email"=>"john@mydomain.com", "dept"=>"Finance"), array("name"=>"Lilly", "email"=>"lilly@mydomain.com", "dept"=>"Sales"), array("name"=>"Austin", "email"=>"austin@mydomain.com", "dept"=>"HR"), array("name"=>"Whites", "email"=>"whites@mydomain.com", "dept"=>"Finance"), array("name"=>"Milan", "email"=>"milan@mydomain.com", "dept"=>"Sales") ); $filter = array("Lilly", "Whites"); $new_array = array_filter($myarray, function($var) use ($filter)< return in_array($var['name'], $filter); >); echo "
"; print_r($new_array); ?>

Output:

Array ( [1] => Array ( [name] => Lilly [email] => lilly@mydomain.com [dept] => Sales ) [3] => Array ( [name] => Whites [email] => whites@mydomain.com [dept] => Finance ) )

In the above code, we have filtered the sourcearray only to contain those elements (arrays) which have their name in the list we provided. When you provide a separate filtering condition in the callback, you must include 'use' before it.

Likewise you can filter the multi dimensional array by key value with php. Filtering one dimensional or simply the array is much simpler that doing it with two or more dimensional. I hope this helps. Please share the post if you find it useful 🙂

Источник

Читайте также:  Python get exe version
Оцените статью