У меня есть следующий массив в php, который я пытаюсь отфильтровать по дате. Дата сохраняется в формате «Ymd» в ключе 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"}
}
Я использовал следующий код, но он добавляет [{0: «Id»: 18280, «…], когда я json_encode его.
$records = array_filter($bookings, function($value) {
$todays_date = date('Ymd');
return $value['DropDate'] < (int)$todays_date;
});
Я не уверен, как я могу сделать array_search на меньше, чем значение для поля dropdate.
$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"}]
Я придумал это, используя мощный 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
)
)
Приятнее работать с метками времени. Надеюсь это поможет.
Демо-версия: 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