From d0d1edb3aecbb377ab8473de6ca8e6a9d922445d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Mon, 17 Nov 2025 09:50:00 +0100 Subject: [PATCH] feat: sort pickups by their times --- src/BusProNet/XmlLoader/PickupLoader.php | 31 ++++++++++++++++++------ src/BusProNet/XmlLoader/TravelLoader.php | 5 ++-- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/BusProNet/XmlLoader/PickupLoader.php b/src/BusProNet/XmlLoader/PickupLoader.php index 65c6cf6..f4be487 100644 --- a/src/BusProNet/XmlLoader/PickupLoader.php +++ b/src/BusProNet/XmlLoader/PickupLoader.php @@ -61,7 +61,13 @@ class PickupLoader extends AbstractLoader public function patchPickupsDetails(Travel $travel): void { - foreach ($travel->pickupsTo as $pickupId => $pickup) { + $travel->pickupsTo = $this->patchAndSortPickups($travel->pickupsTo); + $travel->pickupsFro = $this->patchAndSortPickups($travel->pickupsFro); + } + + private function patchAndSortPickups(array $pickups): array + { + foreach ($pickups as $pickupId => $pickup) { $pickupData = $this->loadById($pickupId); $pickup->code = $pickupData->code; @@ -69,13 +75,24 @@ class PickupLoader extends AbstractLoader $pickup->city = $pickupData->city; $pickup->street = $pickupData->street; } - foreach ($travel->pickupsFro as $pickupId => $pickup) { - $pickupData = $this->loadById($pickupId); - $pickup->code = $pickupData->code; - $pickup->postalCode = $pickupData->postalCode; - $pickup->city = $pickupData->city; - $pickup->street = $pickupData->street; + uasort($pickups, fn (Pickup $a, Pickup $b): int => $this->comparePickupsByTime($a, $b)); + + return $pickups; + } + + private function comparePickupsByTime(Pickup $a, Pickup $b): int + { + if (null === $a->time && null === $b->time) { + return 0; } + if (null === $a->time) { + return -1; + } + if (null === $b->time) { + return 1; + } + + return $a->time <=> $b->time; } } diff --git a/src/BusProNet/XmlLoader/TravelLoader.php b/src/BusProNet/XmlLoader/TravelLoader.php index 8c6d241..95eb1d4 100644 --- a/src/BusProNet/XmlLoader/TravelLoader.php +++ b/src/BusProNet/XmlLoader/TravelLoader.php @@ -133,13 +133,14 @@ class TravelLoader extends AbstractLoader $hotelNode = $this->getHotelNode($node, $hotelId); $dateFrom = $this->stringToDate($node->attr('termin')); + $dateTo = $this->stringToDate($node->attr('bis')); $travel = new Travel(); $travel->id = (int) $node->attr('idbuspro'); $travel->hotelId = (int) $hotelNode->attr('idbuspro'); $travel->label = $this->getStringOrNullValue($node->filterXPath('//text')); $travel->dateFrom = $dateFrom; - $travel->dateTo = $this->stringToDate($node->attr('bis')); + $travel->dateTo = $dateTo; $travel->code = $node->attr('code'); $travel->type = $node->attr('reiseart'); $travel->priceFrom = $this->stringToFloat($this->getStringOrNullValue($node->filterXPath('//abpreis'))); @@ -150,7 +151,7 @@ class TravelLoader extends AbstractLoader ->getTransportationServices($node->filterXPath('//lei_befoerderung/leistung')); $travel->rooms = $this->getRooms($hotelNode); $travel->pickupsTo = $this->getPickups($node->filterXPath('//zustiege/zustieg'), $dateFrom); - $travel->pickupsFro = $this->getPickups($node->filterXPath('//zustiege_rueck/zustieg_rueck')); + $travel->pickupsFro = $this->getPickups($node->filterXPath('//zustiege_rueck/zustieg_rueck'), $dateTo); $travel->guide = $this->getGuide($node); return $travel;