在 PHP 中使用整数过滤数组值


Filtering array values using integers in PHP

我试图通过将包含 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 应仅保留值为 20 的"start-date-unix"项。

实际结果:

该过滤器不执行任何操作,接受每个值。$filtered_array 仍然包含这两个项目。

什么有效:

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

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

$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)
    }
);

$unix_now应该是filter_future函数中的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" } } 
$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]);
    }
}

像下面这样更改函数:

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

function filter_future内移动$unix_now = 15;

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

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