array_filter - Фильтрует элементы массива с помощью функции обратного вызова
массив array_filter (массив $input [, обратный вызов обратного вызова])
Может ли callback получить ключ текущего значения массива и как?
array_filter - Фильтрует элементы массива с помощью функции обратного вызова
массив array_filter (массив $input [, обратный вызов обратного вызова])
Может ли callback получить ключ текущего значения массива и как?
Из документации: PHP 5.6.0 Добавлен необязательный параметр и константы флага ARRAY_FILTER_USE_KEY и ARRAY_FILTER_USE_BOTH
В предыдущем комментарии вы указали, что вы действительно ищете что-то вроде этого:
foreach ($t as $k => $v)
if (!array_key_exists($k, $valid))
unset($t[$k])
Так что фактически удалять все значения из массива $t
, у которых нет ключа в массиве $valid
.
Функция PHP для этого называется array_intersect_key
. Пересечение равно отфильтрованному результату:
$filtered = array_intersect_key($t, $valid);
Невозможно разрешить обратный вызов array_filter
доступа к ключу элемента и не существует аналогичной функции, которая делает то, что вы хотите.
Однако вы можете написать свою собственную функцию для этого, как показано ниже:
function arrayfilter(array $array, callable $callback = null) {
if ($callback == null) {
$callback = function($key, $val) {
return (bool) $val;
};
}
$return = array();
foreach ($array as $key => $val) {
if ($callback($key, $val)) {
$return[$key] = $val;
}
}
return $return;
}
$test_array = array('foo', 'a' => 'the a', 'b' => 'the b', 11 => 1101, '', null, false, 0);
$array = arrayfilter($test_array, function($key, $val) {
return is_string($key);
});
print_r($array);
/*
Array
(
[a] => the a
[b] => the b
)
*/
$array = arrayfilter($test_array);
print_r($array);
/*
Array
(
[0] => foo
[a] => the a
[b] => the b
[11] => 1101
)
*/
Вы можете использовать функцию array_walk, как обсуждалось здесь (3-й ответ вниз): возможно ли, если callback в array_filter получит параметр?
Мне не понравились другие варианты, предлагаемые здесь, если кто-то еще ищет эту функцию, вот быстрая реализация:
function array_filter_keys($a, $c){
$i=array_filter(array_keys($a), $c);
return array_intersect_key($a, array_flip($i));
}
Результат этой функции - это то, на что она похожа, она вернет массив, отфильтрованный функцией обратного вызова, которая получает ключи, а не значения.
EDIT:
Это скорее отказ от ответственности, после прочтения некоторых других комментариев я понимаю, что ОП на самом деле просто ищет array_intersect
, как указал Хакре. Я оставлю этот ответ здесь, хотя, поскольку в вопросе OPs явно не указано, что эта потребность появляется, и эта страница отображается в google для array_filter_keys
Используя константу ARRAY_FILTER_USE_BOTH
, вы можете получить и значение, и ключ:
array_filter($arrFoo, function ($value, $key) { return 'name' === $key && $value > 1 }, ARRAY_FILTER_USE_BOTH)
Используя константу ARRAY_FILTER_USE_KEY
, вы можете получить только ключ:
array_filter($arrFoo, function ($key) { return 'name' === $key }, ARRAY_FILTER_USE_KEY)