【问题标题】:Array_filter and empty()Array_filter 和 empty()
【发布时间】:2011-12-06 12:22:27
【问题描述】:

警告:array_filter() 期望参数 2 是有效的回调, 未找到函数“空”或函数名无效......

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

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

这可行:if(empty($arr['foo'])) die();

【问题讨论】:

    标签: php array-filter


    【解决方案1】:

    回答

    empty() 不是一个函数,而是一个语言结构,array_filter() 只能接受一个函数作为其回调。

    这在手册页上作为一个小注释给出:

    注意:因为这是一个语言结构而不是一个函数,它 无法使用variable functions调用

    解决方法

    要解决这个问题,您可以将空包装在另一个函数中,例如:

    function empty_test($val) {
        return empty($val);
    }
    

    然后这样称呼它:

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

    【讨论】:

    • +1 用于解决方法。这里有一些更有创意的东西(但我认为要贵得多):$arr = array_diff($arr, array_filter($arr));
    • 不错。弄清楚这里的行为在起作用也有点费力!
    【解决方案2】:

    the documentation page on empty():

    注意:因为这是一种语言结构而不是函数,所以不能使用变量函数调用它

    所以基本上empty()不是函数,而且因为回调必须是函数,所以empty()不能作为回调传递 >.

    但是您可以创建可能使用empty() 的回调。以下应该在 PHP > 5.3 中工作:

    $arr = array_filter($arr, function($var){
        return empty($var);
    });
    

    在 PHP array_filter()。

    有帮助吗?

    【讨论】:

    • 如果过滤掉空值只需添加 !empty($var) 因为这个例子过滤掉非空值,返回一个空值数组。
    【解决方案3】:

    empty() 是一种语言结构,而不是真正的 PHP 函数,因此您不能将其名称作为参数传递给 array_filter()call_user_func_array() 等函数。

    来自手册:

    注意:因为这是一个语言结构而不是一个函数,所以不能使用variable functions调用它

    对于一个解决方法,只需将其包装在另一个用户定义的函数中;见Treffynnon's answer

    【讨论】:

      【解决方案4】:

      您可以只使用 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
      )
      

      【讨论】:

        【解决方案5】:

        我认为存在更好的解决方案,我发现它阅读了doc 关于array_filter

        查看此评论:https://www.php.net/manual/fr/function.array-filter.php#111091

        <?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" }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          • 2011-03-26
          • 1970-01-01
          • 2014-08-01
          • 2021-10-02
          • 1970-01-01
          • 2013-04-01
          相关资源
          最近更新 更多