Перебор всех дней - отстой. Есть вариант красивей:
$firstDayOfWeek = (int)(new DateTime('first day of this month'))->format('N'); // номер дня недели (от 1=пнд до 7=вск) первого дня месяца
$daysInMonth = (int)(new DateTime('last day of this month'))->format('j'); // количество дней в месяце
$lastDayOfWeek = (int)$firstDayOfWeek + ($daysInMonth % 28); // номер дня недели (от 1=пнд до 10!) последнего дня месяца
echo 4 + (int)($firstDayOfWeek <= 5 && $lastDayOfWeek >= 5); // 4 полных недели есть в каждом месяце. И в некоторых еще будет пятая пятница, если месяц начинается <= пятницы, а заканчивается >=.