【问题标题】:Filtering array values using integers in PHP在 PHP 中使用整数过滤数组值
【发布时间】:2013-09-15 09:38:54
【问题描述】:

我正在尝试通过比较包含 unix 日期字符串(“start-unix-date”)的字段与 当前 unix 时间(简化在本例中为“15”)。我只想保留 unix 日期在未来(>= 比现在)的项目。

这是我的代码的简化版本 - 基于this filtering method

$my_array = array(
    array( 'start-date-unix' => '20' ), 
    array( 'start-date-unix'  => '10')
);

$unix_now = 15;

function filter_future($var) {
    return (is_array($var) && $var['start-date-unix'] >= $unix_now)
}

$filtered_array = array_filter($my_array, "filter_future");

var_dump($filtered_array);

预期结果:

$filtered_array 应该只保留“start-date-unix”值为 20 的项目。

实际结果:

该过滤器不做任何事情,每个值都被接受。 $filtered_array 仍然包含这两个项目。

什么有效:

在 filter_future 中,如果我输入数字 (15) 而不是 $unix_now 变量,它会按预期工作:只保留“20”项。

所以我怀疑 $unix_now 是字符串还是整数存在问题。我尝试了许多将其强制为整数的方法,但似乎没有任何效果:(

【问题讨论】:

    标签: php arrays filter integer


    【解决方案1】:

    $unix_now 应该是 filter_future-function 中的 global 变量。

    $unix_now = 15;
    
    function filter_future($var) {
        global $unix_now;
        return (is_array($var) && (int) $var['start-date-unix'] >= $unix_now)
    }
    
    $filtered_array = array_filter($my_array, "filter_future");
    
    var_dump($filtered_array);
    

    结果:

    array(1) { [0]=> array(1) { ["start-date-unix"]=> string(2) "20" } } 
    

    【讨论】:

    • 当然,只是 stackoverflow 在我批准之前会延迟 10 分钟,然后我又回到了我的工作流程中 :)
    【解决方案2】:
    $my_array = array(
        array( 'start-date-unix' => '20' ), 
        array( 'start-date-unix'  => '10')
    );
    
    $unix_now = 15;
    
    foreach ($my_array as $i => $row)
    {
        if ($row['start-date-unix'] < $unix_now)
        {
            unset($my_array[$i]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      改变你的功能如下:

      function filter_future($var) {
          $unix_now = 15;
          return (is_array($var) && $var['start-date-unix'] >= $unix_now);
      }
      

      【讨论】:

        【解决方案4】:

        $unix_now 超出了回调函数的范围:

        使用带有 use 关键字的闭包将 $unix_now 值传递给回调

        $unix_now = 15;
        $filtered_array = array_filter(
            $my_array, 
            function ($var) use ($unix_now) {
                return (is_array($var) && $var['start-date-unix'] >= $unix_now)
            }
        );
        

        【讨论】:

        • 这似乎是 4 个(到目前为止)答案中更优雅的选择(恕我直言)
        【解决方案5】:

        $unix_now = 15;移动到function filter_future

        function filter_future($var) {
            $unix_now = 15;
            return (is_array($var) && $var['start-date-unix'] >= $unix_now);
        }
        

        您的函数内部的$unix_now 无法识别外部变量$unix_now。所以把它放在你的函数里会更好

        【讨论】:

        • 实际上,$unix_now 这个函数是在我的代码中完全不同的地方定义的。我这里的例子是一个非常简化的版本。
        猜你喜欢
        • 2017-01-24
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        • 2018-05-04
        • 2018-11-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多