2012-11-17 11 views
5

Ci scusiamo se questo è stato chiesto prima, tuttavia ho difficoltà a trovare la risposta al mio problema.php foreach inside per problemi con le istruzioni

Sto cercando di creare un sistema di calendario e programmare il sistema per la mia applicazione web in PHP e avere difficoltà con una particolare area.

ho un "per" dichiarazione in cui elabora i momenti della giornata a partire dalle 12:00 e finitura a 11:30

All'interno di questo ciclo, ho un foreach, che voglio eco fuori gli oggetti in una matrice che corrisponde a un particolare momento.

Tutto ciò che ho provato, che include le istruzioni for, while e foreach, non mostra ciò che sono dopo gli eventi in coda al momento.

Ecco il mio codice

<?php 
$tStart = strtotime($start_time); 
$tEnd = strtotime($end_time); 
$tNow = $tStart; 

while($items = mysql_fetch_object($result)){ 
    $events[] = $items; 
} 

for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){ 
    // Time to color the rows to make it easier to read 
    if(!isset($day_row)){ 
     $day_row = "0"; 
    } 
    if(isset($day_row) && $day_row >= "2"){ 
     $day_row--; 
    } 
    else{ $day_row++; 
    } 

    //This bit draws the first column. 
    echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>"; 

    // MySQL stuff is now here 
    foreach($events as $e => $item){ 
     if($item->apnt_start == $tnow){ 
      $rowspan = ((strtotime($item->apnt_finish)-strtotime($item->apnt_start))/"1800"); 
      echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\">".$item->apnt_start."-".$item->apnt_finish." ".$item->apnt_brief."</td></tr>"; 
     } 
    } 
} 
?> 

attualmente mi viene data una pagina con
12:00
12:30
01:00
01:30
02 : 00:00
02:30
03:00
03:30
04:00
04:30
05:00
05:30

Accanto alla volta voglio l'appuntamento con il tempo corrispondente.

Sto cercando di ottenere qualcosa di simile a http://mrbs.sourceforge.net/ Non riesco a utilizzare il loro sistema tuttavia come non riesco a integrarlo correttamente e ho provato a guardare il loro codice e sembra di puntare a molti file e io sono avere problemi a cercare di capire la funzione che sto cercando.

Per favore fatemi sapere se questo non è abbastanza chiaro e proverò a spiegare ulteriormente.

+0

In cosa consiste il tuo codice e in che cosa differisce da quello che stai cercando? – octern

+0

con l'istruzione if in posizione sotto il ciclo foreach non appare nulla. sembra che $ tNow rimarrà alle 12:00 AM e non andrà avanti. come faccio a ottenere il $ tOra di andare avanti in modo che il foreach alla fine si avveri se c'è un evento? – Laywah

risposta

0

Vorrei ringraziare tutti coloro che ha fornito consigli su questo tema, ho finalmente capito di lavoro con l'aggiunta di un'altra variabile e utilizzando un metodo di memorizzazione una matrice in una matrice.

Il codice finale sembra

<?php 
    $tStart = strtotime($start_time); 
    $tEnd = strtotime($end_time); 
    $tNow = $tStart; 
    $events = array(); 
    $eas = "0"; // eas stands for Event Array Start. this will be used to cycle through the events in the array. 
    while($items = mysql_fetch_assoc($result)){ 
     $events[] = $items; 
    } 

    for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){ 
     // Time to color the rows to make it easier to read 
      if(!isset($day_row)){ 
       $day_row = "0"; 
      } 
      if(isset($day_row) && $day_row >= "2"){ 
       $day_row--; 
      } 
      else{ $day_row++; 
      } 

      //This bit draws the first column. 
      echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>"; 
     if(strtotime($events[$eas]['apnt_start']) == $tNow) {  
       $rowspan = ((strtotime($events[$eas]['apnt_finish'])-strtotime($events[$eas]['apnt_start']))/"1800"); 
       echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\" >".$events[$eas]['apnt_start']."-".$events[$eas]['apnt_finish']." ".$events[$eas]['apnt_brief']."</td></tr>"; 
       $eas++; 
      } 
      else{ 
       echo "<td class=\"day_row".$day_row."\"></td>"; 
      } 
     } //end for 
?> 

Usando la variabile $ eas ho potuto quindi controllare quale numero sarebbe iniziare a impostando a 0 inizialmente e poi, quando ha trovato una voce con un corrispondente tempo è passato attraverso l'istruzione if dove alla fine dell'istruzione if è stato dato $ eas ++ per incrementare.

Questo ha dimostrato che se non ci fosse stato un appuntamento, $ eas non sarebbe stato eseguito e non sarebbe aumentato, rimanendo quindi sull'ultimo $ incremento incrementato.

Grazie ancora per l'aiuto di tutti.

0

è necessario definire e impostare il valore per le variabili di seguito:

$start_time = "09:00 AM"; 
$end_time = "11:30 PM"; 

Inoltre è necessario aggiungere query e connessione al database (sopra while($items = mysql_fetch_object($result)){ dichiarazione):

mysql_connect("hostname", "user", "password"); 
mysql_select_db("mydb"); 
$result = mysql_query("select * from mytable"); 

EDIT: È dovrebbe usare mentre mysql_fetch_assoc invece di mysql_fetch_object. Sostituire

while($items = mysql_fetch_object($result)){ 

con

while($items = mysql_fetch_assoc($result)){ 

Delete: $events[] = $items;

garantire la vostra dichiarazione mentre al di sopra si conclude dopo l'esecuzione tutto il codice (codice hai elencato nella tua domanda) - chiusura staffa }.

+0

Scusa se ho dimenticato di dire che ho impostato $ start_time e $ end_time in un altro file. Ho anche un mysql.php generico che definisce le informazioni di connessione di cui stai parlando. Sto ottenendo gli articoli $ popolati con informazioni da mysql tuttavia il mio problema più recente in cui le informazioni non corrispondevano al momento in cui è stato programmato. – Laywah

+0

Quindi qual è il problema? Riguarda l'output HTML; cercando di metterlo in tavola o qualcosa del genere? – salih0vicX

+0

facendo un print_r ($ events) fornisce la seguente matrice ([0] => stdClass Object ([apnt_id] => 6 [apnt_person] => 3 [apnt_date] => 2012-11-17 [apnt_start] => 00 : 00 [apnt_finish] => 00:30 [apnt_brief] => test 3 [apnt_description] => test description 3) [1] => stdClass Object ([apnt_id] => 4 [apnt_person] => 3 [apnt_date] = > 2012-11-17 [apnt_start] => 08:30 [apnt_finish] => 09:00 [apnt_brief] => test 1 [apnt_description] => test description 1) [2] => stdClass Object ([apnt_id] = > 5 [apnt_person] => 3 [apnt_date] => 2012-11-17 [apnt_start] => 12:00 Non riesco a inserire tutti i dettagli dell'array in. – Laywah

0

Ok, questo dovrebbe funzionare per voi.

<?php 
    $tStart = strtotime($start_time); 
    $tEnd = strtotime($end_time); 
    $tNow = $tStart; 

    echo '<table>'; 

    while($events = mysql_fetch_assoc($result)){ 
     for($tNow=$tStart; $tNow<$tEnd; $tNow=strtotime('+30 minutes',$tNow)){ 
     // Time to color the rows to make it easier to read 
      if(!isset($day_row)){ 
       $day_row = "0"; 
      } 
      if(isset($day_row) && $day_row >= "2"){ 
       $day_row--; 
      } 
      else{ $day_row++; 
      } 

      //This bit draws the first column. 
      echo "<tr><td class=\"day_row".$day_row."\" width=\"70px\">".date("h:i A",$tNow)."</td>"; 
      if(strtotime($events['apnt_start']) == $tNow) {  
       $rowspan = ((strtotime($events->apnt_finish)-strtotime($events->apnt_start))/"1800"); 
       echo "<td class=\"day_row_apnt\" rowspan=\"$rowspan\">".$events->apnt_start."-".$events->apnt_finish." ".$events->apnt_brief."</td></tr>"; 
      } 
     } //end for 
    } //end while 
    echo '</table>'; 
?> 
+0

Grazie Salih0vicX, Questo è quasi corretto. I tempi stanno comparendo dove dovrebbero e così dovrebbero gli eventi, comunque ..... Se ho tre eventi per il giorno sto ricevendo 12am a 12am tre volte con 1 evento su ogni iterazione di 12am a 12am .. Io credo questo è dovuto all'istruzione while, è corretto? c'è un modo per averlo in modo che ci sia 1 iterazione dalle 12 alle 12 e i 3 eventi presentati in quella 1 iterazione? – Laywah