Array_filter和empty()

时间:2011-12-06 12:22:27

标签: php array-filter

  

警告:array_filter()期望参数2是有效的回调,   功能'空'未找到或功能名称无效....

为什么空被认为是无效的回调?

$arr = array_filter($arr, 'empty');

这有效:if(empty($arr['foo'])) die();

5 个答案:

答案 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本身已经过滤了nullfalse值作为默认回调,因此此代码也可以工作:

$array = array('apple', '', 'watermelon');
var_dump(array_filter($array));

----
Output : 
array(2) { [0]=> string(5) "apple" [2]=> string(10) "watermelon" }