Помогите новичку в php, отфильтровать массив
Всем доброго времени суток. Помогите новичку в php, отфильтровать массив. В скрипте php через запрос curl получаю данные в переменную $date. Пример данных в переменной $date:
tdClass Object
(
[Entities] => stdClass Object
(
[BackupTaskSessions] => stdClass Object
(
[BackupTaskSessions] => Array
(
[0] => stdClass Object
(
[CreationTimeUTC] => 2020-09-07T16:05:44Z
[EndTimeUTC] => 2020-09-07T16:06:23Z
[State] => Completed
[Result] => Success
[TotalSize] => 32212254720
[VmDisplayName] => nonono.local
[Name] => nonono.local@2020-09-07 16:05:44
)
[1] => stdClass Object
(
[CreationTimeUTC] => 2020-10-31T16:41:39Z
[EndTimeUTC] => 2020-10-31T16:42:20Z
[State] => Completed
[Result] => Success
[TotalSize] => 32282254420
[VmDisplayName] => hohohohoho.local
[Name] => hohohohoho.local@2020-10-31 16:41:39
)
[2] => stdClass Object
(
[CreationTimeUTC] => 2020-10-31T17:41:39Z
[EndTimeUTC] => 2020-18-31T17:42:20Z
[State] => Completed
[Result] => Success
[TotalSize] => 32412294720
[VmDisplayName] => hahahahaha.local
[Name] => hahahahaha.local@2020-10-31 17:41:39
)
[3] => stdClass Object
(
[CreationTimeUTC] => 2020-09-07T17:05:44Z
[EndTimeUTC] => 2020-09-07T17:06:23Z
[State] => Completed
[Result] => Success
[TotalSize] => 32212754820
[VmDisplayName] => nanana.local
[Name] => nanana.local@2020-09-07 17:05:44
)
и т.д.
)
)
)
)
Необходимо отфильтровать Array по вчерашней дате ключа CreationTimeUTC. Дату задаю так
$cdate = gmdate("Y-m-d\TH:i:s\Z", strtotime("-1 day"));
Для понимания чего хочу добиться в результате если $cdate = 2020-10-31T00:00:00Z
Результат:
tdClass Object
(
[Entities] => stdClass Object
(
[BackupTaskSessions] => stdClass Object
(
[BackupTaskSessions] => Array
(
[1] => stdClass Object
(
[CreationTimeUTC] => 2020-10-31T16:41:39Z
[EndTimeUTC] => 2020-10-31T16:42:20Z
[State] => Completed
[Result] => Success
[TotalSize] => 32282254420
[VmDisplayName] => hohohohoho.local
[Name] => hohohohoho.local@2020-10-31 16:41:39
)
[2] => stdClass Object
(
[CreationTimeUTC] => 2020-10-31T17:41:39Z
[EndTimeUTC] => 2020-18-31T17:42:20Z
[State] => Completed
[Result] => Success
[TotalSize] => 32412294720
[VmDisplayName] => hahahahaha.local
[Name] => hahahahaha.local@2020-10-31 17:41:39
)
и т.д.
)
)
)
)
Заранее благодарю за помощь.
Ответы (1 шт):
Автор решения: Meow
→ Ссылка
const DATETIME_FORMAT = 'Y-m-d\TH:i:s\Z';
$array = [];
$object1 = new stdClass();
$object1->CreationTimeUTC = '2020-11-01T16:41:39Z';
$array[] = $object1;
$object2 = new stdClass();
$object2->CreationTimeUTC = '2020-10-29T12:01:23Z';
$array[] = $object2;
$object3 = new stdClass();
$object3->CreationTimeUTC = '2020-11-01T19:21:44Z';
$array[] = $object3;
$yesterday = (new DateTime)->modify('-1 day');
// Отбросим объекты, у которых дата не равна вчерашней
$array = array_filter($array, function (stdClass $object) use ($yesterday): bool {
$date = DateTime::createFromFormat(DATETIME_FORMAT, $object->CreationTimeUTC);
return $yesterday->format('Y-m-d') === $date->format('Y-m-d');
});
// Затем, сортируем объекты по возрастанию времени
usort($array, function (stdClass $a, stdClass $b): int {
$dateA = DateTime::createFromFormat(DATETIME_FORMAT, $a->CreationTimeUTC);
$dateB = DateTime::createFromFormat(DATETIME_FORMAT, $b->CreationTimeUTC);
return $dateA <=> $dateB;
});
// В массиве остались объекты 1 и 3
Вам только остаётся добраться до массива с датами, путь будет примерно такой: $stdObject->Entities->BackupTaskSessions->BackupTaskSessions;