webForumDet fria alternativet

Tankehjälp med arrayer

PHPur PHP

4 svar · 226 visningar · startad av nkrantz

Medlem sedan apr. 2002830 inlägg
Frågan#1

Hej!

håller fortfarande på med en liten kalender, har nu kommit så långt att jag vill kunna visa dagens aktiviteter på ett någorlunda grafiskt sätt. Problem uppstår ju givetvis om två aktiviteter är under samma tid, jag har lösningen på hur jag skall göra det rent praktiskt, men jag vet inte riktigt hur jag skall komma dit.

Informationen sparas i en array, enligt nedan:

$array['datum']['starttid-sluttid'][0] = "aktivitet";
$array['2002-01-01'][19:00-20:00][0] = "aktivitet";

Men om det är så att starttiden ligger i intervallet av starttid-sluttid för en annan aktivitet så vill jag ju att det skall sparas på följande sätt:

$array['datum']['starttid-sluttid'][1] = "aktivitet som kolliderar"
$array['2002-01-01'][19:00-20:30][1] = "aktivitet som kolliderar";

Mitt problem är alltså mao: Hur skall jag kunna kontrollera i starttid-sluttid nyckeln på arrayen om det redan finns något som händer då jag vill lägga in mer info i arrayen? Jag kan inte köra med exempelvis isset() eller något liknande eftersom det nu rör sig om intervall.

Eller har ni något annat smart sätt att lösa det hela på?

mvh,
Niclas

Medlem sedan aug. 20002 975 inlägg
#2

Ett sätt att kolla om det är upptaget:

function check_time($array, $datum, $starttid, $stopptid){

  if (!isset($array[$datum])) {
    
    return true;
    
  } else {
    
    foreach($array[$datum] as $key => $val) {
      $split_time = explode("-", $key);
      if ( ($starttid >= $split_time[0] && $starttid < $split_time[1]) ||
           ($stopptid > $split_time[0] && $stopptid <= $split_time[1]) ) {
        return false;
      }  
    }
    
    return true;
      
  }

}

Kan användas så här:

$datum = "2002-01-01";
$starttid = "19:00";
$stopptid = "20:30";

if ( check_time($array, $datum, $starttid, $stopptid) ) {

  $array[$datum][$starttid."-".$stopptid][] = "aktivitet";

} else {

  $array[$datum][$starttid."-".$stopptid][] = "aktivitet som kolliderar";

}

Fast då kommer du inte att få index 1 på slutet. Svårt att styra det, för om du redan har 19-20 och 20-21 uppbokat och någon försöker boka 19:30-20:30, vilken ska den då sättas på.

Utan att ha tänkt igenom det allt för mycket skulle jag nog ha delat upp dygnet i 24 delar (eller när det nu är tillgängligt att boka) och sen med checkbokar låtit de bocka för de tider (halvtimmar) som de önskar. Enkelt att kolla. Går då också att "dimma" de checkboxar där tiden redan är bokad, om man går in på ett visst datum.

Medlem sedan apr. 2002830 inlägg
#3

Tack för hjälpen!

Det funkar däremot inte som jag hade tänkt mig, kanske var lite otydlig... sorry för det isf.

Alltså, har en kalender med en dagsvy, när man bokar skall man kunna boka med 15 minutersintervall, saken är den att man SKALL kunna dubbelboka saker, tex ha tvättstugan samtidigt som man vill kolla på en bra film... (bra exempel ;) )

Tanken är att om det finns något uppbokat under den tiden man bokar skall denna nya aktivitet flyttas ut i schemat. Det vill säga, man kan ha 20:00-21:00 bokat samtidigt som man har 20:15-22:00 och 21:30 till 23:00 bokat. Så på något sätt måste jag titta om det finns en eller två eller tre aktiviteter under tiden jag skall boka för att kunna justera denna aktivitet rätt...

Kanske bättre förklarat? Funderar på att ändra tiderna till timestamps istället... inte för jag vet om det skulle hjälpa något, men ändå... hehe

Medlem sedan aug. 20002 975 inlägg
#4

Då fixar jag inte att hjälpa dig. Visserligen går det att bygga på min array så den returnerar hur många andra aktiviteter den krockar med.

Själv skulle jag ha satsat på kvartarna i arrayen:

$array[datum]['00:00'][0] = "";
$array[datum]['00:15'][0] = "";
.
.
$array[datum]['19.30'][0] = "aktivitet";
$array[datum]['19.30'][1] = "dubbelbokat";
$array[datum]['19.45'][0] = "aktivitet";
.
.
Medlem sedan apr. 2002830 inlägg
#5

Jo, jag kör kvartar i arrayen.. funderar på om det kanske är lättare att arbeta med timestamps.. hm.. tål att tänka på!

Tack så mycket för din hjälp ändå!

/Niclas

138 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)