我试图通过将包含 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
。所以把它放在你的函数里更好