![](/img/trans.png)
[英]PHP array_filter - How to array_filter arrays using multiple keys in the callback function?
[英]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_KEY
和ARRAY_FILTER_USE_BOTH
在您之前概述的评论中,您实际上正在寻找这样的东西:
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.