Trouver des créneaux horaires libres

Signaler
Messages postés
55
Date d'inscription
jeudi 7 novembre 2002
Statut
Membre
Dernière intervention
17 août 2012
-
Bonjour @ all !
J'ai besoin d'un peu d'aide sur un problème qui est le suivant:

En gros, je tente de faire un script qui permet de réserver des plages horaires correspondantes à des RDV dans une journée pour des durées X en minutes.

Je parviens à détecter si des dates se chevauchent, mais le problème est que je souhaite stocker dans un tableau les crénaux possibles avec par exemple ce cas d'utilisation:

Début journée : 08:00:00
Fin journée : 12:00:00

Créneaux réservés :
08:00:00 - 09:00:00
11:00:00 - 11:30:00

Je dois donc récupérer dans mon tableau les créneaux libres qui sont pour une durée de 45mn par exemple:
09:00:00 - 09:45:00
09:45:00 - 10:30:00

Voici le code avec lequel j'ai efectué mes tests, mais qui sont non concluants, je pense que j'ai un problème de raisonnement ou bien qu'il y a une autre méthode qui me permettrait de réaliser tout ça:

$nb_prestataires= 1;
$from_hour='2012-08-09 08:00:00';
$to_hour='2012-08-09 10:30:00';

$duree_prestation=60;//mn


$plages_query = mysql_query("select * from reservations");
while ($row = mysql_fetch_object($plages_query)) {

   $plages_reservees[] =array(
                             'from'=> new DateTime($row->debut),
                             'to'=> new DateTime($row->fin)
                            );



}
mysql_free_result($plages_query);


function count_same_plage($plage, $array_to_check){

    $items = 0;

    foreach($array_to_check as $item_to_check){

        if ($plage === $item_to_check) {
        //print_r($plage); print_r($item_to_check);
        $items++;
        }



    }



    return $items;



}





$plages_non_reservees=array();





$plages_disponibles=array();
try {
    $from_hour_date = new DateTime($from_hour);
    $to_hour_date = new DateTime($to_hour);

} catch (Exception $e) {
    echo $e->getMessage();
    exit(1);
}



while($from_hour_date<$to_hour_date){

$to_from=$from_hour_date->format('Y-m-d H:i:s');
 $plages_non_reservees[]=array(
                             'from'=>new DateTime($to_from),

                              'to'=>new DateTime(date_add($from_hour_date, date_interval_create_from_date_string($duree_prestation.' minutes'))->format('Y-m-d H:i:s'))

                         );

}





//Recherche des plages possibles pour la prestation

foreach($plages_non_reservees as $key=>$plage){//Pour toutes les plages possibles
//print_r($plage);

    foreach($plages_reservees as $plage_reservee){

    echo "".$plage_reservee['from']->format('H:i:s')." | ". $plage_reservee['to']->format('H:i:s')." vs ".$plage['from']->format('H:i:s')." | ". $plage['to']->format('H:i:s');


$startTime =strtotime($plage_reservee['from']->format('H:i:s'));
$endTime = strtotime($plage_reservee['to']->format('H:i:s'));


$chkStartTime = strtotime($plage['from']->format('H:i:s'));
$chkEndTime = strtotime($plage['to']->format('H:i:s'));

//echo $compare_to_hour_date->format('d/m/Y H:i:s');

if( ($chkStartTime >= $startTime) && ($chkEndTime <= $endTime)){
echo "yo";
}
if(($startTime <= $chkStartTime) ){



 if(  1){

if($chkStartTime > $startTime && $chkEndTime < $endTime)
{   
echo "1 Time is in between start and end time";
    
}elseif(($chkStartTime > $startTime && $chkStartTime < $endTime) || ($chkEndTime > $startTime && $chkEndTime < $endTime))
{    
echo "2 ChK start or end Time is in between start and end time";
    
}elseif($chkStartTime==$startTime || $chkEndTime==$endTime)
{    
echo "3 ChK start or end Time is at the border of start and end time";

    
}elseif($startTime > $chkStartTime && $endTime < $chkEndTime)
{    
echo "4 start and end Time is overlapping  chk start and end time";
    
}else{


      



        if (!in_array($plage, $plages_disponibles) && !in_array($plage, $plages_reservees) ) {
        $plages_disponibles[]=$plage;
    echo "  ".$plage['from']->format('H:i:s')." | ".$plage['to']->format('H:i:s')."";
    }
    echo count_same_plage($plage,$plages_disponibles);
      
}


    echo "

";
        }

    }

}

}


?>



 Plages réservées 
<?php
echo "";
print_r($plages_reservees);
echo "

";
?>




Plages disponibles
<?php

foreach($plages_disponibles as $key =>$plage_dispo){

if(($key)<count($plages_disponibles)-1){
if($plages_disponibles[$key]['from']->format('Y-m-d H:i:s') == $plages_disponibles[$key+1]['from']->format('Y-m-d H:i:s')){


echo $key.$plages_disponibles[$key]['from']->format('Y-m-d H:i:s')." == ".$plages_disponibles[$key+1]['from']->format('Y-m-d H:i:s')."
";
unset($plages_disponibles[$key]);
}

}


}








echo "";
print_r(($plages_disponibles));
echo "

";
?>






Merci d'avance à la communauté pour votre aide !