array_filter - 使用回调函数
过滤数组的元素array array_filter(array $ input [,callback $ callback])
可以回调获取当前数组值的键以及如何?
答案 0 :(得分:11)
从文档中: PHP 5.6.0添加了可选的标志参数和常量ARRAY_FILTER_USE_KEY和ARRAY_FILTER_USE_BOTH
答案 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)