【问题标题】:Filter with callback misses some condition带有回调的过滤器错过了一些条件
【发布时间】:2021-04-26 13:36:00
【问题描述】:

我有以下代码来过滤 PHP 中的数组;它工作正常。但是在添加更多过滤条件后,它就停止工作了。

工作代码

$s_item = array_values(array_filter($itmlist, function ($itmlist) {
    return ($itmlist['itmslsprc'] > 0);
    }
)); 

添加更多条件后不起作用的代码

$s_item = array_values(array_filter($itmlist, function ($itmlist) {
    return ($itmlist['itmslsprc'] > 0 && $today >= $itmlist['itmslsfr']  &&  $today <= $itmlist['itmslsto']);
    }
));

$today 和其他日期均已初始化为 2021-01-12 00:00:00 格式。

谁能告诉我可能出了什么问题? 提前感谢您的任何建议。

【问题讨论】:

  • $today 定义在哪里
  • 如果你想在嵌套函数中使用 $today 你必须通过它!可能您的 $today 变量未定义
  • 不同格式有什么问题? “不起作用”听起来很笼统,那么您尝试过什么调试呢?

标签: php closures


【解决方案1】:

如果你的今天在函数之外,你可以像这样在函数内部使用它:

$s_item = array_values(array_filter($itmlist, function ($itmlist) use($today) {
    return ($itmlist['itmslsprc'] > 0 && $today >= $itmlist['itmslsfr']  &&  $today <= $itmlist['itmslsto']);
    }
));

【讨论】:

    【解决方案2】:

    如果您的今天不在功能范围内,您可以使用“使用”

    【讨论】:

    • 请避免重复现有答案,除非您想添加其他答案中未涵盖的内容
    【解决方案3】:

    如前所述,您可以只导入回调范围内的变量,依赖于use statement

    PHP Closures 不会自动绑定到外部作用域(就像在 Javascript 等语言中发生的那样)。

    但如果您坚持更实用的编程范式(并使用 PHP >=7.4),则可以避免手动导入并依赖 PHP Arrow Functions

    $today = // your value here
    
    $s_item = array_values(array_filter($itmlist, fn($itmlist) =>
        $itmlist['itmslsprc'] > 0 &&
        $today >= $itmlist['itmslsfr'] &&
        $today <= $itmlist['itmslsto']
    ));
    

    fn() =&gt; returnExpression 将有权访问$today

    注意

    这是一个按值复制,如手册​​中所述:

    当表达式中使用的变量在父作用域中定义时,它将被隐式地按值捕获。

    如果您想修改外部变量,并且不希望额外的闭包参数,那么use 语句是您的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      相关资源
      最近更新 更多