PHP数组_过滤器,如何在回调中获取密钥?

PHP数组_过滤器,如何在回调中获取密钥?,php,arrays,callback,array-filter,Php,Arrays,Callback,Array Filter,array_filter-使用回调函数过滤数组的元素 数组\u过滤器(数组$input[,回调$callback]) 回调函数可以获取当前数组值的键吗?如何获取?您可以使用此处讨论的array\u walk函数(下面是第三个答案):在前面的评论中,您概述了您实际上在寻找类似的内容: foreach ($t as $k => $v) if (!array_key_exists($k, $valid)) unset($t[$k]) 因此,实际上要从数组$t中删除所有在

array_filter-使用回调函数过滤数组的元素

数组\u过滤器(数组$input[,回调$callback])


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

您可以使用此处讨论的array\u walk函数(下面是第三个答案):

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

foreach ($t as $k => $v)
    if (!array_key_exists($k, $valid))
        unset($t[$k])
因此,实际上要从数组
$t
中删除所有在数组
$valid
中没有键的值

该函数的PHP函数被调用。交点等于过滤后的结果:

$filtered = array_intersect_key($t, $valid);

没有办法让元素的回调访问元素的键,也没有类似的函数可以满足您的需要

但是,您可以为此编写自己的函数,如下所示:

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
)
*/

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

function array_filter_keys($a, $c){
    $i=array_filter(array_keys($a), $c);
    return array_intersect_key($a, array_flip($i));
}
这个函数的结果与它听起来的完全一样,它将返回一个由接收键而不是值的回调函数过滤的数组

编辑: 这更像是一个免责声明,在阅读了其他一些评论之后,我意识到OP实际上只是在寻找hakre指出的
array\u intersect
。不过,我将在这里留下这个答案,因为OPs问题没有明确说明这一需求,并且该页面显示在google中,用于获取阵列过滤键,文档如下所示: PHP 5.6.0添加了可选的标志参数和常量
ARRAY\u FILTER\u USE\u KEY
ARRAY\u FILTER\u USE\u两者


通过使用
数组过滤器\u USE\u BOTH
常量,您可以同时获得值和键:

array_filter($arrFoo, function ($value, $key) { return 'name' === $key && $value > 1 }, ARRAY_FILTER_USE_BOTH)

通过使用
ARRAY\u FILTER\u USE\u KEY
常量,您可以单独获取密钥:

array_filter($arrFoo, function ($key) { return 'name' === $key }, ARRAY_FILTER_USE_KEY)

太棘手了,我使用的是索引数组而不是关联数组。在这个解决方案中,键是硬编码的。也许一个更标准的
code
foreach($arr as$key=>$val){}实现可以满足您的需要。我需要过滤输入数组:如果键存在于另一个数组中,那么返回元素。我找到了
array\u filter
候选者,但我无法在回调中获取当前数组值的键。也就是说:
foreach($t as$k=>$v),如果(!array\u key\u存在($k,$valid))unset($t[$k])
但对我来说看起来很糟糕……这就是我将如何实现您所描述的内容的方法。