<?php
$year = "2025";
$stage = "01";
$classifications = ['ITG', 'IPG', 'IMG', 'IJG', 'ETG'];
$results = [];
$teamPositions = [];

$mh = curl_multi_init();

// Multi-curl request for team data and stage data
$teamDataUrl = "https://api.cycling.matsport.com/competitions/{$year}_LUX";
$ch_team = curl_init($teamDataUrl);
curl_setopt($ch_team, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch_team);

$apiUrl = "https://api.cycling.matsport.com/stages/{$year}_LUX_STAGE_{$stage}";
$ch_stage = curl_init($apiUrl);
curl_setopt($ch_stage, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($mh, $ch_stage);

// Execute all requests in parallel
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running);

// Close handles
curl_multi_remove_handle($mh, $ch_team);
curl_multi_remove_handle($mh, $ch_stage);
curl_multi_close($mh);

// Process team data
$teamData = json_decode(curl_multi_getcontent($ch_team), true);
if (isset($teamData['teams']) && is_array($teamData['teams'])) {
    $teamPositions = array_map(function ($index, $team) {
        return [
            'TeamName' => $team['name'],
            'Position' => '#' . ($index + 1)
        ];
    }, array_keys($teamData['teams']), $teamData['teams']);
}

// Process stage data
$data = json_decode(curl_multi_getcontent($ch_stage), true);

foreach ($classifications as $classification) {
    $riderData = [];

    foreach ($teamData['teams'] as $team) {
        foreach ($team['riders'] as $rider) {
            $bibNumber = $rider['bib'];
            $riderName = $rider['firstname'] . ' ' . $rider['lastname'];
            $nationality = $rider['nationality'];
            $riderImage = $rider['image'];
            $teamName = $team['name'];

            $riderData[$bibNumber] = [
                'BibNumber' => "#$bibNumber",
                'Rank' => '',
                'RiderName' => $riderName,
                'TeamName' => $teamName,
                'RiderImage' => $riderImage,
                'Nationality' => $nationality,
                'Capital' => '',
                'Bonus' => '',
                'Gap' => '',
                'Penalty' => '',
                'Status' => ''
            ];
        }
    }

    if (isset($data['rankingTypes']) && is_array($data['rankingTypes'])) {
        foreach ($data['rankingTypes'] as $rankingType) {
            if ($rankingType['type'] === $classification && isset($rankingType['rankings']) && is_array($rankingType['rankings'])) {
                $ranking = $rankingType['rankings'][0] ?? null;

               if ($ranking) {
                    $bibNumber = $ranking['bib'];

                    if (isset($riderData[$bibNumber]) || $classification === 'ETG') {
                        if ($classification !== 'ETG'){$riderInfo = $riderData[$bibNumber];}
                        $position = $ranking['position'] === -1 ? 'DNF' : $ranking['position'];
                      
                      if ($classification === 'ETG' && isset($teamPositions[$bibNumber-1])) {
                            $teamInfo = $teamPositions[$bibNumber-1];
                            $riderInfo['RiderName'] = $teamInfo['TeamName'];
                        $riderInfo['TeamName'] = '';
                        }
                      
                      global $results;

                        $results[] = [
                            'Classification' => $classification,
                            'BibNumber' => $bibNumber,
                            'RiderName' => $riderInfo['RiderName'],
                            'Capital' => $ranking['capital'] ?? '-',
                            'TeamName' => $riderInfo['TeamName']
                        ];
                    } else {
                        echo "<script>console.log('No rider information found for bibNumber: $bibNumber');</script>";
                    }
                }
            }
        }
    }
}

function getValueOrAwaited($value) {
    return !empty($value) ? $value : 'Data awaited';
}

function getITGBib() {
    global $results;
    return getValueOrAwaited($results[0]['BibNumber']);
}

function getITGRider() {
    global $results;
    return getValueOrAwaited($results[0]['RiderName']);
}

function getITGCapital() {
    global $results;
    return getValueOrAwaited($results[0]['Capital']);
}

function getITGTeam() {
    global $results;
    return getValueOrAwaited($results[0]['TeamName']);
}

function getIPGBib() {
    global $results;
    return getValueOrAwaited($results[1]['BibNumber']);
}

function getIPGRider() {
    global $results;
    return getValueOrAwaited($results[1]['RiderName']);
}

function getIPGCapital() {
    global $results;
    return getValueOrAwaited($results[1]['Capital']);
}

function getIPGTeam() {
    global $results;
    return getValueOrAwaited($results[1]['TeamName']);
}

function getIMGBib() {
    global $results;
    return getValueOrAwaited($results[2]['BibNumber']);
}

function getIMGRider() {
    global $results;
    return getValueOrAwaited($results[2]['RiderName']);
}

function getIMGCapital() {
    global $results;
    return getValueOrAwaited($results[2]['Capital']);
}

function getIMGTeam() {
    global $results;
    return getValueOrAwaited($results[2]['TeamName']);
}

function getIJGBib() {
    global $results;
    return getValueOrAwaited($results[3]['BibNumber']);
}

function getIJGRider() {
    global $results;
    return getValueOrAwaited($results[3]['RiderName']);
}

function getIJGCapital() {
    global $results;
    return getValueOrAwaited($results[3]['Capital']);
}

function getIJGTeam() {
    global $results;
    return getValueOrAwaited($results[3]['TeamName']);
}

function getETGRider() {
    global $results;
    return getValueOrAwaited($results[4]['RiderName']);
}

function getETGCapital() {
    global $results;
    return getValueOrAwaited($results[4]['Capital']);
}
?>
Luxemburg Logo
UCI Pro Series Logo
EF EDUCATION - EASYPOST

#35 Marijn VAN DEN BERG

7:35:40
EF EDUCATION - EASYPOST

#35 Marijn VAN DEN BERG

33 pts
TEAM COLOQUICK

#143 Conrad HAUGSTED

13 pts
DECATHLON CMA CGM TEAM

#23 Pierre GAUTHERAT

7:35:44
Beste Mannschaft

TEAM VISMA | LEASE A BIKE

22:47:52
ALLE ERGEBNISSE FINDEN SIE HIER
Ergebnisse Daten nach Matsport
ZUM NEWSLETTER ANMELDEN
Bleiben Sie auf dem Laufenden mit den neuesten Nachrichten
Live-Rangliste für 2026
EF EDUCATION - EASYPOST

##35 Marijn VAN DEN BERG

7:35:40
EF EDUCATION - EASYPOST

##35 Marijn VAN DEN BERG

33 pts
TEAM COLOQUICK

##143 Conrad HAUGSTED

13 pts
DECATHLON CMA CGM TEAM

##23 Pierre GAUTHERAT

7:35:44
Beste Mannschaft

TEAM VISMA | LEASE A BIKE

22:47:52
ALLE ERGEBNISSE FINDEN SIE HIER
Ergebnisse Daten nach Matsport
ZUM NEWSLETTER ANMELDEN
Bleiben Sie auf dem Laufenden über die neuesten Nachrichten

Gewinner Etappe 2 – Marijn van den Berg

Foto: Serge Waldbillig

Škoda Tour de Luxembourg

MEHR NEWS

SOZIALE MEDIEN

Folgen Sie uns in den sozialen Medien, um schnell und live informiert zu werden:
Skoda Tour de Luxembourg Favicon
Škoda Tour de Luxembourg

ETAPPEN 2026

Entdecken Sie die Route

ETAPPE 1

Luxemburg - Knuedler > Luxemburg - Fëschmaart

MEHR INFO

Stufe 1

ETAPPE 2

Differdingen/Niederkorn > Junglinster

MEHR INFO

Stufe-2

ETAPPE 3

Wiltz > Diekirch

MEHR INFO

Stufe 3

ETAPPE 4

Ettelbrück > Ettelbrück

MEHR INFO

Stufe 4

ETAPPE 5

Mersch > Luxemburg - Limpertsberg

MEHR INFO

Stufe 5

ALLE ETAPPEN SEHEN

PARTNER

GALERIE

Sehen Sie sich die neuesten Fotos und Videos von der Škoda Tour de Luxembourg an
Tour de LuxembourgALLE BILDER UND VIDEOS

Skoda Tour de Luxembourg 2024 Anhänger

NEWSLETTER

Bleiben Sie auf dem Laufenden mit den neuesten Nachrichten von der Tournee

NEWSLETTER

Bleiben Sie auf dem Laufenden mit den neuesten Nachrichten von der Tournee
[dflip id="25818" ][/dflip]

NEWSLETTER

Bleiben Sie auf dem Laufenden mit den neuesten Nachrichten von der Tournee
ETAPPEDATUMROUTEDISTANZ
Etappe 118/09Luxemburg Place Guillaume II > Luxemburg Kirchberg156,4 kms
Etappe 219/09Junglinster > Schifflange155,0 kms
Etappe 320/09Rosport > Diekrich201,3 kms
Etappe 421/09Differdange > Differdange15,5 kms
Etappe 522/09Mersch > Luxemburg Limpertsberg176,9 kms