Как фильтровать массив в php используя значение array_search меньше чем

У меня есть следующий массив в 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"}]

3

Решение

array_filter это правильный путь.

Примечание. Сравнение двух строк даты будет работать так же хорошо, как сравнение двух временных отметок, но ИМХО лучше использовать временные отметки.

Попробуй это:

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

echo json_encode($records);

Выход:

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

eval.in demo

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
)

)

Приятнее работать с метками времени. Надеюсь это поможет.

Демо-версия: 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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector