如何使用小于array_search的值过滤 php 中的数组



我在 php 中有以下数组,我正在尝试根据日期过滤。Date 在 DropDate 键中存储为"Ymd"格式。

我想在 Dropdate <20171102的地方应用过滤器,这样它只显示我 1 条记录。

array(3) {
    [0]=>
    array(30) {
        ["Id"]=>
        int(18762)
        ["DropDate"]=>
        string(8) "20171101"
    }
    [1]=>
    array(30) {
        ["Id"]=>
        int(18760)
        ["DropDate"]=>
        string(8) "20171102"
    }
    [2]=>
    array(30) {
        ["Id"]=>
        int(18258)
        ["DropDate"]=>
        string(8) "20171102"
    }
}

我使用了以下代码,但它在json_encode它时添加了 [{0:"Id":18280,"...]。

$records = array_filter($bookings, function($value) {
        $todays_date = date('Ymd');
        return $value['DropDate'] < (int)$todays_date;
    });

我不确定如何对 dropdate 字段的小于值进行array_search。

$todays_date = date('Ymd');
    if(($key = array_search($todays_date, array_column($student,'DropDate'))) !== false) {
        unset($student[$key]);
    }

然后,当我json_encode将其返回到我的应用程序时,我得到了奇怪的行为,例如它在每个对象的前面添加了 0 和 1。

 [{"0":{"Id":18280,"DropDate":"20171030"},"1":{"Id":18284,"DropDate":"20171101"}}]  

我的应用程序期望这个没有 0 或 1

 [{"Id":18280,"DropDate":"20171030"},{"Id":18284,"DropDate":"20171101"}]

array_filter是正确的方法。

注意:比较两个日期字符串与比较两个时间戳一样有效,但恕我直言,最好使用时间戳。

试试这个:

$records = array_filter($bookings, function ($row) {
    return $row['DropDate'] < date('Ymd');
});
echo json_encode($records);

输出:

[{"Id":18762,"DropDate":"20171101"}]

eval.in 演示

我使用强大的DateTimearray_filter想出了这个:

<?php
$bookings = [
  ['Id' => 18762, 'DropDate' => '20171101'],
  ['Id' => 18760, 'DropDate' => '20171102'],
  ['Id' => 18258, 'DropDate' => '20171102'],
];
$records = array_filter($bookings, function ($row) {
  $today = DateTime::createFromFormat('Y-m-d', date('Y-m-d'))->format('U');
  $booking_date = DateTime::createFromFormat('Ymd', $row['DropDate'])->format('U');
  return $booking_date < $today;
});
print_r($records);

这给出了:

Array
(
    [0] => Array
        (
            [Id] => 18762
            [DropDate] => 20171101
        )
)

使用时间戳更好。希望这有帮助。

演示:https://eval.in/891570


关于问题末尾的 JSON 内容

$input = <<<JSON
[{"0":{"Id":18280,"DropDate":"20171030"},"1":{"Id":18284,"DropDate":"20171101"}}] 
JSON;

您可以从源代码进行解码,例如:

$decoded = json_decode($input, true);
$bookings = array_values($decoded[0]);

然后使用上面的代码。

演示:https://eval.in/891591

最新更新