PHP array_filter, как получить ключ в обратном вызове?

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

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

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

Ответ 2

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

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

Невозможно разрешить обратный вызов 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
)
*/

Ответ 5

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

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

Ответ 6

Используя константу 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)