3

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

这是我的代码的简化版本 - 基于此过滤方法

$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 是一个字符串还是一个整数存在问题。我尝试了许多将其强制为整数的方法,但似乎没有任何效果:(

4

5 回答 5

1

$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)
    }
);
于 2013-09-11T11:34:33.590 回答
0

$unix_now应该是globalfilter_future-function 中的一个变量。

$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" } } 
于 2013-09-11T11:32:15.007 回答
0
$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]);
    }
}
于 2013-09-11T11:33:20.563 回答
0

$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。所以把它放在你的函数里面会更好

于 2013-09-11T11:43:09.027 回答
0

更改您的功能,如下所示:

function filter_future($var) {
    $unix_now = 15;
    return (is_array($var) && $var['start-date-unix'] >= $unix_now);
}
于 2013-09-11T11:34:23.077 回答