Функция обратного вызова in array_filter()
передает только значения массива, а не ключи.
Если у меня есть:
$my_array = array("foo" => 1, "hello" => "world");
$allowed = array("foo", "bar");
Какой лучший способ удалить все ключи $my_array
, которых нет в $allowed
массиве?
Желаемый вывод:
$my_array = array("foo" => 1);
$b = ['foo' => $a['foo'], 'bar' => $a['bar']]
это приведет к тому,$b['bar']
чтоnull
.Ответы:
PHP 5.6 введен третий параметр
array_filter()
,flag
, что вы можете установить дляARRAY_FILTER_USE_KEY
фильтрации по ключу вместо значения:Ясно, что это не так элегантно, как
array_intersect_key($my_array, array_flip($allowed))
, но он предлагает дополнительную гибкость выполнения произвольного теста с ключом, например,$allowed
может содержать шаблоны регулярных выражений вместо простых строк.Вы также можете использовать,
ARRAY_FILTER_USE_BOTH
чтобы и значение, и ключ передавались в функцию фильтра. Вот надуманный пример, основанный на первом, но обратите внимание, что я бы не рекомендовал использовать правила фильтрации кодирования$allowed
таким способом:источник
array_intersect
С
array_intersect_key
иarray_flip
:источник
array_flip
? Просто определите с$allowed
помощью клавиш:allowed = array ( 'foo' => 1, 'bar' => 1 );
Мне нужно было сделать то же самое, но с более сложными
array_filter
клавишами.Вот как я это сделал, используя аналогичный метод.
Это выводит результат:
источник
Вот более гибкое решение с использованием замыкания:
Выходы:
Таким образом, в функции вы можете выполнять другие конкретные тесты.
источник
Если вы ищете метод для фильтрации массива по строке, встречающейся в ключах, вы можете использовать:
Результатом
print_r($mResult)
являетсяАдаптация этого ответа, которая поддерживает регулярные выражения
Вывод
источник
stristr
в рамках «работы» функции делает некоторые предположения для конечного пользователя. Возможно, было бы лучше позволить пользователю передавать регулярное выражение; это дало бы им больше гибкости по отношению к определенным вещам, таким как привязки, границы слов, чувствительность к регистру и т. д.Как получить текущий ключ массива при использовании
array_filter
Независимо от того, как мне нравится решение Винсента для проблемы Мачека, оно на самом деле не используется
array_filter
. Если вы пришли сюда из поисковой системы, вы, возможно, искали что-то вроде этого ( PHP> = 5.3 ):Он передает массив, который вы фильтруете, как ссылку на обратный вызов. Так
array_filter
как условно не перебирать массив, увеличивая его публичный внутренний указатель, вы должны продвигать его самостоятельно.Здесь важно то, что вам нужно убедиться, что ваш массив сброшен, иначе вы можете начать прямо с середины.
В PHP> = 5.4 вы можете сделать обратный вызов еще короче:
источник
Вот менее гибкая альтернатива с использованием unset () :
Результат
print_r($array)
бытия:Это не применимо, если вы хотите сохранить отфильтрованные значения для последующего использования, но аккуратнее, если вы уверены, что это не так.
источник
unset()
. Предупреждения не выдаются, если ключ не существует.Начиная с PHP 5.6, вы можете использовать
ARRAY_FILTER_USE_KEY
флаг вarray_filter
:В противном случае вы можете использовать эту функцию ( из TestDummy ):
А вот моя дополненная версия, которая принимает обратный вызов или непосредственно ключи:
И последнее, но не менее важное: вы также можете использовать простое
foreach
:источник
Возможно, это излишне, если вам это нужно только один раз, но вы можете использовать библиотеку YaLinqo * для фильтрации коллекций (и выполнения любых других преобразований). Эта библиотека позволяет выполнять SQL-подобные запросы к объектам с свободным синтаксисом. Его
where
функция принимает обратный вызов с двумя аргументами: значением и ключом. Например:(
where
Функция возвращает итератор, поэтому, если вам нужно только выполнить итерациюforeach
по полученной последовательности один раз,->toArray()
ее можно удалить.)* разработано мной
источник
функция фильтра массива из php:
$ array - это входной массив
$ callback_function - Используемая функция обратного вызова. function Если функция обратного вызова возвращает true , текущее значение из массива возвращается в массив результатов.
$ flag - это необязательный параметр , он определяет, какие аргументы отправляются в функцию обратного вызова. Если этот параметр пуст, то функция обратного вызова будет принимать значения массива в качестве аргумента. Если вы хотите отправить ключ массива в качестве аргумента, используйте $ flag как ARRAY_FILTER_USE_KEY . Если вы хотите отправить ключи и значения, вы должны использовать $ flag как ARRAY_FILTER_USE_BOTH .
Например: рассмотрим простой массив
Если вы хотите фильтровать массив на основе ключа массива , нам нужно использовать ARRAY_FILTER_USE_KEY в качестве третьего параметра функции массива array_filter.
Если вы хотите фильтровать массив на основе ключа массива и значения массива , нам нужно использовать ARRAY_FILTER_USE_BOTH в качестве третьего параметра функции массива array_filter.
Пример функции обратного вызова:
Будет выводить
источник
С помощью этой функции вы можете фильтровать многомерный массив
источник
источник
Наивное и некрасивое (но, кажется, более быстрое) решение?
Только попробовал это в php 7.3.11, но уродливый цикл, кажется, выполняется примерно в трети времени. Аналогичные результаты для массива с несколькими сотнями ключей. Микрооптимизация, возможно, не полезна в RW, но показалась удивительной и интересной:
источник
источник