我在php中有以下数组,我试图在日期过滤。日期存储为" Ymd" DropDate键中的格式。
我想在Dropdate< 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字段的值小于value的情况下执行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"}]
答案 0 :(得分:1)
array_filter
是正确的方法。
注意:比较两个日期字符串的效果与比较两个时间戳的效果一样,但恕我直言,使用时间戳会更好。
试试这个:
$records = array_filter($bookings, function ($row) {
return $row['DropDate'] < date('Ymd');
});
echo json_encode($records);
输出:
[{"Id":18762,"DropDate":"20171101"}]
答案 1 :(得分:1)
我使用功能强大的DateTime
和array_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
)
)
更好地使用时间戳。希望这会有所帮助。
关于问题末尾的JSON内容
$input = <<<JSON
[{"0":{"Id":18280,"DropDate":"20171030"},"1":{"Id":18284,"DropDate":"20171101"}}]
JSON;
您可以从您的来源解码,如:
$decoded = json_decode($input, true);
$bookings = array_values($decoded[0]);
然后使用上面的代码。