wp_list_filter()
Фильтрует массив объектов (или массив массивов) и получает из массива те объекты, у которых есть указанный нами параметр.
Например, у нас есть массив объектов и нам нужно получить из этого массива объект в значении которого поле post_title
равно my title
. Для этого в параметр $list передаем исходный массив объектов, а в $args указываем параметры отбора: [ 'post_title' => 'my title' ]
. В результате, функция вернет новый массив с нужным нам объектом.
Важно: ключи основного массива сохраняются! Т.е. Ключи элементов в результирующем массиве будут такие же какие были в основном, а не по-порядку (0 1 2). Т.е. нельзя получать первый элемент как $result_array[0]
.
Поэтому, чтобы получить первый элемент массива используйте функцию array_shift()
или reset()
.
Работает на раннем этапе загрузки WordPress, еще до константы SHORTINIT.
Различия между: wp_list_filter() и wp_filter_object_list()
- wp_list_filter( $list, $args, $operator ) — фильтрует переданный массив и возвращает его элементы как есть (полностью), например если в значении был объект, то вернется весь объект.
- wp_filter_object_list( $list, $args, $operator, $field ) — работает точно также. Но если указать 4-й параметр $field, то после фильтрации массива, сработает функция wp_list_pluck() и из значений отфильтрованного массива будет взято только указанное в 4-м параметре поле (ключ).
Хуков нет.
Возвращает
Массив
. Массив, который был получен после выборки.
Использование
wp_list_filter( $input_list, $args, $operator );
- $list(массив) (обязательный)
- Массив объектов, с которым будем работать.
- $args(массив)
- Параметры по которым нужно выбирать объекты. Указываем в массиве
key => val
. val не может быть массивом из нескольких значений - только одно значение...
По умолчанию: array() - $operator(строка)
Указывает как обрабатывать указанные в $args параметры. Может быть:
OR
— оставит объекты у которых есть любой из указанных параметров.AND
— оставит объекты объекты у которых есть одновременно все указанные параметры.NOT
— оставит объекты у которых нет указанных параметров.
По умолчанию: 'AND'
Примеры
#1 Проверим наличие объекта с указанным значением в массиве
Есть массив объектов постов. Нам нужно проверить если ли среди постов, пост с заголовком 'some_title':
global $posts; $title = 'some_title'; $the_post = wp_list_filter( $posts, [ 'post_title' => $title ] ); // если в массиве постов $posts есть пост с заголовком 'some_title', то // array_shift($the_post) вернет этот объект.
#2 Демонстрация работы функции
Предположим у нас есть массив объектов. В каждом объекте есть поле count
и в некоторых оно равно 0. Нам нужно получить все объекты массива значение count
которых не 0, но не одинаковое. И тоже самое сделаем с массивом массивов.
Массив объектов:
$objects_array = [ 57 => (object) [ 'parent' => 80, 'count' => 9, ], 58 => (object) [ 'parent' => 80, 'count' => 0, ], 59 => (object) [ 'parent' => 80, 'count' => 4, ], ]; $filtered_array = wp_list_filter( $objects_array, [ 'count' => true ] ); /* $filtered_array = Array ( [57] => stdClass Object ( [parent] => 80 [count] => 9 ) [59] => stdClass Object ( [parent] => 80 [count] => 4 ) ) */
Массив массивов:
$arrays_array = [ 57 => [ 'parent' => 80, 'count' => 9, ], 58 => [ 'parent' => 80, 'count' => 0, ], 59 => [ 'parent' => 80, 'count' => 4, ], ]; $filtered_array = wp_list_filter( $arrays_array, [ 'count' => true ] ); /* $filtered_array = Array ( [57] => Array ( [parent] => 80 [count] => 9 ) [59] => Array ( [parent] => 80 [count] => 4 ) ) */
#3 Соберем элементы без указания ключа
$arr = [ 'foo', 'bar', 'foo', 'bar' ]; $list = wp_list_filter( $arr, array('bar') ); /* Array ( [1] => bar [3] => bar ) */
#4 Еще примеры
Еще примеры смотрите в описании функции: wp_filter_object_list()
Список изменений
С версии 3.1.0 | Введена. |
С версии 4.7.0 | Uses WP_List_Util class. |
С версии 5.9.0 | Converted into a wrapper for wp_filter_object_list(). |
Код wp_list_filter() wp list filter WP 6.7.1
function wp_list_filter( $input_list, $args = array(), $operator = 'AND' ) { return wp_filter_object_list( $input_list, $args, $operator ); }