【发布时间】:2011-10-08 21:38:36
【问题描述】:
array_filter — 使用回调函数过滤数组元素
array array_filter ( array $input [, callback $callback ] )
callback能否获取当前数组值的key以及如何获取?
【问题讨论】:
标签: php arrays callback array-filter
array_filter — 使用回调函数过滤数组元素
array array_filter ( array $input [, callback $callback ] )
callback能否获取当前数组值的key以及如何获取?
【问题讨论】:
标签: php arrays callback array-filter
来自文档:
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_USE_BOTH 常量,您可以获得值和键:
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)
【讨论】:
没有办法让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_walk 函数(第 3 个答案):is it possible if callback in array_filter receive parameter?
【讨论】:
codeforeach ($arr as $key => $val) {} 实现可以满足您的需求。
array_filter 候选人,但我无法在回调中获取当前数组值的键。
foreach ($t as $k => $v) if (!array_key_exists($k, $valid)) unset($t[$k]) 但对我来说看起来很可怕......
我不喜欢这里建议的其他选项,如果其他人正在寻找此功能,这里有一个快速实现:
function array_filter_keys($a, $c){
$i=array_filter(array_keys($a), $c);
return array_intersect_key($a, array_flip($i));
}
这个函数的结果正是它听起来的样子,它将返回一个由回调函数过滤的数组,该回调函数接收键而不是值。
编辑:
这更像是一种免责声明,在阅读了其他一些 cmets 之后,我意识到 OP 实际上只是在寻找 array_intersect,正如 hakre 指出的那样。我会在这里留下这个答案,因为 OPs 问题没有明确说明需要,并且这个页面显示在 google 中的 array_filter_keys
【讨论】: