This should do what you want and allows for an uneven number of teams. Dates might not be perfect because of the rounding down:
$teams = array("TEAM A","TEAM B","TEAM C","TEAM D","TEAM E", "TEAM F","TEAM G","TEAM H","TEAM I");
$days = 28;
$rounds = count($teams) -1;
//Number of Days Between Fixtures
$daysBetweenFixtures = floor($days / $rounds);
$fixtures = array();
for($i =0; $i < count($teams); $i++) {
//Calculate Date of this round of fixtures
$date = date("D d M Y",mktime(0, 0, 0, date("m") , date("d")+ ($i * $daysBetweenFixtures) , date("Y")));
$hasFixtureToday = array();
for($j=$i; $j<$i+count($teams); $j=$j+2) {
$homeTeam = $teams[$j % count($teams)];
$awayTeam = $teams[($j+1) % count($teams)];
if(!in_array($homeTeam,$hasFixtureToday) && !in_array($awayTeam,$hasFixtureToday)) {
$fixtures[$date][] = "{$homeTeam} vs {$awayTeam}";
$hasFixtureToday[] = $homeTeam;
$hasFixtureToday[] = $awayTeam;
}
}
}
print_r($fixtures);