<?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']);
}
?>
Logo du Luxembourg
Logo de l'UCI Pro Series
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
Meilleure équipe

TEAM VISMA | LEASE A BIKE

22:47:52
VOIR TOUS LES RÉSULTATS ICI
Résultats Données par Matsport
S'abonner aux Actualités
Restez au courant des dernières nouvelles
Classements en direct pour 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
Meilleure équipe

TEAM VISMA | LEASE A BIKE

22:47:52
VOIR TOUS LES RÉSULTATS ICI
Résultats Données par Matsport
S'abonner aux Actualités
Restez au courant des dernières nouvelles

Gagnant de l'étape 2 – Marijn van den Berg

Photo : Serge Waldbillig

Škoda Tour de Luxembourg

PLUS DE NOUVELLES

MÉDIAS SOCIAUX

Suivez-nous sur les médias sociaux pour obtenir des mises à jour rapides et en direct :
Skoda Tour de Luxembourg Favicon
Škoda Tour de Luxembourg

STAGES 2026

Découvrir l'itinéraire

ÉTAPE 1

Luxembourg - Knuedler > Luxembourg - Fëschmaart

PLUS D'INFORMATIONS

Étape 1

ÉTAPE 2

Differdange/Niederkorn > Junglinster

PLUS D'INFORMATIONS

Étape 2

ÉTAPE 3

Wiltz > Diekirch

PLUS D'INFORMATIONS

Étape 3

ÉTAPE 4

Ettelbruck > Ettelbruck

PLUS D'INFORMATIONS

Étape 4

ÉTAPE 5

Mersch > Luxembourg - Limpertsberg

PLUS D'INFORMATIONS

Étape 5

VOIR TOUTES LES ÉTAPES

PARTENAIRES

GALERIE

Découvrez les dernières photos et vidéos du Škoda Tour de Luxembourg
Tour de LuxembourgTOUTES LES IMAGES ET VIDÉOS

Skoda Tour de Luxembourg 2024 Trailer

LETTRE D'INFORMATION

Restez au courant des dernières nouvelles de la tournée

LETTRE D'INFORMATION

Restez au courant des dernières nouvelles de la tournée
[dflip id="25818" ][/dflip]

LETTRE D'INFORMATION

Restez au courant des dernières nouvelles de la tournée
STAGEDATEROUTEDISTANCE
Étape 118/09Luxembourg Place Guillaume II > Luxembourg Kirchberg156,4 kms
Étape 219/09Junglinster > Schifflange155,0 kms
Étape 320/09Rosport > Diekrich201,3 kms
Étape 421/09Differdange > Differdange15,5 km
Étape 522/09Mersch > Luxembourg Limpertsberg176,9 kms