PHP array_filter,如何在回调中获取密钥?

时间:2011-10-08 21:38:37

标签: php arrays callback array-filter

  

array_filter - 使用回调函数

过滤数组的元素      

array array_filter(array $ input [,callback $ callback])

可以回调获取当前数组值的键以及如何?

6 个答案:

答案 0 :(得分:11)

从文档中: PHP 5.6.0添加了可选的标志参数和常量ARRAY_FILTER_USE_KEY和ARRAY_FILTER_USE_BOTH

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

答案 1 :(得分:7)

在之前的评论中,您概述了您实际上正在寻找类似的内容:

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);

答案 2 :(得分: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
)
*/

答案 3 :(得分:0)

您可以使用此处讨论的array_walk函数(第3个答案):is it possible if callback in array_filter receive parameter?

答案 4 :(得分:0)

我不喜欢这里建议的其他选项,如果有其他人正在寻找此功能,这里有一个快速实现:

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

这个函数的结果正是它听起来的样子,它将返回一个由回调函数过滤的数组,该函数接收键而不是值。

编辑: 这是一个免责声明,在阅读了其他一些评论后,我发现OP实际上只是在寻找array_intersect,正如hakre指出的那样。我会在这里留下这个答案,因为OP的问题没有明确说明需要,这个页面显示在谷歌中的array_filter_keys

答案 5 :(得分:0)

通过使用ARRAY_FILTER_USE_BOTH常量,您可以同时获得value和key:

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)