<?php

// horários que são exibidos para os clientes
$hours        = array('08:00','08:30','09:00','09:30','10:00','10:30','11:00','11:30','12:00','12:30','13:00','13:30','14:00');

// horários que os clientes marcaram
$schedule     = array('08:00','08:00','09:00','09:00','09:00','10:00','10:00','10:00','10:00','11:00','11:00','11:00','11:00','11:00' );

// ao chegar nesse valor de consultas agendada por horário é retirado o horário do array hours
$chooseNumber = 3;

$count        = array_count_values( $schedule );
$array_com_horarios_livres = array();

foreach($hours as $hour){
	# SE O HORÁRIO EM $hours ESTIVERM EM $horasAgendadas E A QUANTIDADE FOR MAIOR OU IGUAL AO LIMITE CONTINUE O LOOP SEM INSERIR
	if(isset($count[$hour]) && $count[$hour] >= $chooseNumber)
		continue;
	$array_com_horarios_livres[] = $hour; # INSERE NO NOVO ARRAY COM OS HORÁRIOS LIVRES
}

print_r($array_com_horarios_livres);