PHP array_filter, как получить ключ в обратном вызове? - PullRequest
12 голосов
/ 09 октября 2011

array_filter - фильтрует элементы массива с помощью функции обратного вызова

массив array_filter (массив $ input [, обратный вызов $ callback])

Может ли обратный вызов получить ключ текущего значения массива и как?

Ответы [ 6 ]

11 голосов
/ 03 февраля 2015

Из документации: PHP 5.6.0 Добавлены необязательный параметр флага и константы ARRAY_FILTER_USE_KEY и ARRAY_FILTER_USE_BOTH

http://php.net/manual/en/function.array-filter.php

7 голосов
/ 13 декабря 2012

В предыдущем комментарии вы обрисовали в общих чертах, что вы на самом деле ищете что-то вроде этого:

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);
3 голосов
/ 02 октября 2013

Нет способа разрешить обратному вызову 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
)
*/
0 голосов
/ 14 декабря 2018

Используя постоянную 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)
0 голосов
/ 03 февраля 2015

Мне не понравились другие варианты, предложенные здесь, если кто-то еще ищет эту функцию, вот быстрая реализация:

function array_filter_keys($a, $c){
    $i=array_filter(array_keys($a), $c);
    return array_intersect_key($a, array_flip($i));
}

Результат этой функции в точности такой, как она звучит, она вернет массив, отфильтрованный функцией обратного вызова, которая получает ключи, а не значения.

EDIT: Это скорее отказ от ответственности, после прочтения некоторых других комментариев я понимаю, что ОП на самом деле просто ищет array_intersect, как указал Хакре. Я оставлю этот ответ здесь, так как в вопросе OP четко не указано, что нужно, и эта страница отображается в google для array_filter_keys

0 голосов
/ 09 октября 2011

Вы можете использовать функцию array_walk, как обсуждалось здесь (третий ответ ниже): возможно ли, если обратный вызов в массиве array_filter получает параметр?

...