繁体   English   中英

PHP array_filter,如何获取回调中的键?

[英]PHP array_filter, how to get the key in callback?

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

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

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

来自文档:PHP 5.6.0 添加了可选标志参数和常量ARRAY_FILTER_USE_KEYARRAY_FILTER_USE_BOTH

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

在您之前概述的评论中,您实际上正在寻找这样的东西:

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

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

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指出。 我会在这里留下这个答案,因为 OPs 问题没有明确说明需要这个页面在谷歌中显示为 array_filter_keys

您可以使用此处讨论的 array_walk 函数(第三个答案): 如果 array_filter 中的回调接收参数,是否可能?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM