filterXPath('//leistungen/leistung') ->each(function (Crawler $node) use (&$availabilities) { $serviceId = (int) $node->attr('id'); $availability = new ExtendedAvailability(); $availability->serviceId = $serviceId; $availability->status = $node->attr('status'); $availability->available = (int) $node->attr('frei'); $availability->price = $this->stringToFloat($node->attr('preis')); $availability->dateFrom = $this->stringToDate($node->attr('termin')); $availability->dateTo = $this->stringToDate($node->attr('bis')); $availability->timeFrom = $node->attr('uhrzeit_von'); $availability->description = $node->attr('hinweis'); $ageFrom = $node->attr('altervon'); if (null !== $ageFrom && '' !== trim($ageFrom)) { $availability->ageFrom = (int) $ageFrom; } $ageTo = $node->attr('alterbis'); if (null !== $ageTo && '' !== trim($ageTo)) { $availability->ageTo = (int) $ageTo; } $mandatory = $node->attr('pflicht'); if (null !== $mandatory && '' !== trim($mandatory)) { $availability->mandatory = $this->stringToBool($mandatory); } $availabilities[$serviceId] = $availability; }) ; $allowedBookingStatus = []; $travelStatus = null; $reiseNode = $result->filterXPath('//reise'); if (0 < $reiseNode->count()) { $travelStatus = $reiseNode->attr('status'); $bookingStatusPossible = $reiseNode->attr('buchungstatusmoeglich') ?? ''; if ('' !== trim($bookingStatusPossible)) { $allowedBookingStatus = str_split($bookingStatusPossible); } } return new ExtendedServiceAvailabilityResponse($availabilities, $allowedBookingStatus, $travelStatus); } }