Using the NBA schedule API with PHP

How to access and filter through the NBA schedule API for season 2021-22 using PHP.

This is not the only way and endpoint to get the NBA schedule however since it is a one and done call where you need no other information like team id’s and dates it is ideal.

The NBA schedule endpoint:

https://cdn.nba.com/static/json/staticData/scheduleLeagueV2_9.json

As this involves the NBA static CDN API you won’t need to do a fancy cURL GET request with origins, referrers and User-Agents included.

The GET request and decode

$data = json_decode(file_get_contents("https://cdn.nba.com/static/json/staticData/scheduleLeagueV2_9.json"), true);

The call will return a large multidimensional array with the data for all the pre-season and regular-season NBA games for season 2021-22.

Below is the correct paths in the array to access every game through a loop.

Looping through the returned data

foreach ($data['leagueSchedule']['gameDates'] as $games) {
    foreach ($games['games'] as $game) {
       //Do stuff here
    }
}

Outputting all the games with the date and time formatted as a readable string:

foreach ($data['leagueSchedule']['gameDates'] as $games) {
    foreach ($games['games'] as $game) {
        $date_time = DateTime::createFromFormat('Y-m-d H:i:s', str_replace(["T", "Z"], [" ", ""], $game['gameDateTimeEst']));
        $date_formatted = $date_time->format('g:ia D jS M Y');
        $home_team = $game['homeTeam']['teamName'];
        $away_team = $game['awayTeam']['teamName'];
        echo "$home_team vs $away_team $date_formatted<br>";
    }
}

This looks like this:

Using the NBA schedule API with PHP example 1

Today’s games only

Getting only today’s games using the ET timezone:

date_default_timezone_set('America/New_York');

$todays_date = date('Y-m-d') . "T00:00:00Z";

foreach ($data['leagueSchedule']['gameDates'] as $games) {
    foreach ($games['games'] as $game) {
        if ($todays_date === $game['gameDateEst']) {
            echo "{$game['homeTeam']['teamName']} vs {$game['awayTeam']['teamName']}<br>";
        }
    }
}

The output:

Using the NBA schedule API with PHP example 2

Filter for only one team

Filter for only one team’s games and add colour depending on home or away game:

$filter_team = 'Clippers';

foreach ($data['leagueSchedule']['gameDates'] as $games) {
    foreach ($games['games'] as $game) {
        $show = false;
        $date_time = DateTime::createFromFormat('Y-m-d H:i:s', str_replace(["T", "Z"], [" ", ""], $game['gameDateTimeEst']));
        $home_team = $game['homeTeam']['teamName'];
        $away_team = $game['awayTeam']['teamName'];
        $date_formatted = $date_time->format('g:ia D jS M Y');
        if ($home_team === $filter_team) {
            $show = true;
            $style = 'background: #87ff8747;';
        } else if ($away_team === $filter_team) {
            $show = true;
            $style = 'background: #ff878747;';
        }
        if ($show) {
            echo "<span style='$style'>$home_team vs $away_team <span style='font-size: 80%'>$date_formatted</span></span><br>";
        }
    }
}

Green is home games whilst red means an away game:

Using the NBA schedule API with PHP example 3

Filter for only regular-season games

Finally to filter only the regular season and not include pre-season games. This is done by using the 3rd character from the game id. 1 is pre-season whilst 2 is regular-season.

Once there was been one regular-season game this confirms that no more checks will be made for game type aiding efficiency in the filter.

$is_reg_season = false;
foreach ($data['leagueSchedule']['gameDates'] as $games) {
    foreach ($games['games'] as $game) {
        if (!$is_reg_season) {
            $game_type_int = (int)substr($game['gameId'], 2, 1);
            if ($game_type_int === 2) {
                $is_reg_season = true;
            }
        }

        if ($is_reg_season) {
          //Gather and output from here

        }
    }
}