警告:array_filter()期望参数2是有效的回调, 功能'空'未找到或功能名称无效....
为什么空被认为是无效的回调?
$arr = array_filter($arr, 'empty');
这有效:if(empty($arr['foo'])) die();
答案 0 :(得分:8)
empty()
不是函数,而是语言结构,array_filter()
只能接受函数作为其回调。
这是手册页上的一个小注释:
注意:因为这是一种语言结构,而不是一种功能 无法使用variable functions
调用
要解决此问题,您可以将空包装在另一个函数中,例如:
function empty_test($val) {
return empty($val);
}
然后这样称呼它:
$arr = array_filter($arr, 'empty_test');
答案 1 :(得分:6)
empty()
是一种语言结构,而不是PHP中的真正函数,因此您不能将其名称作为参数传递给array_filter()
和call_user_func_array()
等函数。 / p>
从手册:
注意:因为这是一种语言结构而不是函数,所以无法使用variable functions
调用它
要获得解决方法,只需将其包装在另一个用户定义的函数中;见Treffynnon's answer。
答案 2 :(得分:6)
请参阅the documentation page on empty()
:
注意:因为这是一种语言结构而不是函数,所以不能使用变量函数调用它
所以基本上 empty()
不是函数,并且因为回调必须是函数,所以 empty()
不能作为函数传递回调强>
但您可以创建可能使用empty()
的回调。以下内容适用于PHP> 5.3:
$arr = array_filter($arr, function($var){
return empty($var);
});
在PHP< 5.3您需要先创建类似的函数,然后将其传递给array_filter()
。
有帮助吗?
答案 3 :(得分:1)
您可以仅使用array_filter()函数而无需回调:
Remove empty array elements in PHP
$arr = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
print_r(array_filter($arr)); // removing blank, null, false, 0 (zero) values
结果:
Array
(
[0] => PHP
[1] => HTML
[2] => CSS
[4] => JavaScript
)
答案 4 :(得分:0)
我认为存在更好的解决方案,我发现它阅读了关于array_filter
的{{3}}
查看此评论:doc
<?php
// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter( $array, 'strlen' );
?>
我只允许自己发布它,因为我认为这是一个非常优雅的解决方案。
此外,由于array_filter
本身已经过滤了null
或false
值作为默认回调,因此此代码也可以工作:
$array = array('apple', '', 'watermelon');
var_dump(array_filter($array));
----
Output :
array(2) { [0]=> string(5) "apple" [2]=> string(10) "watermelon" }