Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9

    Creare array calcolando differenza temporale in ore da un array con elenco datetime

    Ciao ragazzi! E' la prima volta che posto in quanto finora ho sempre trovato cio' che cercavo in questo splendido forum. Ora pero' ho un problemino:
    Ho fatto la seguente funzione per calcolare l'intervallo di tempo in ore tra due mysql datetime:

    Codice PHP:
    function conta_ore($start$end) {

            
    //mi tiro fuori solo le ore di partenza e fine dalle date
            
    $divdataorastart explode(" "$start);
            
    $orastart $divdataorastart[1];
            
    $divdataoraend explode(" "$end);
            
    $oraend $divdataoraend[1];
        
            
    //esplodo le ore di partenza e fine per ottenere due array con ore divise da minuti e  secondi
            
    $part explode(":",$orastart);
            
    $arr explode(":",$oraend);
        
            
    //mktime(ora,minuti,secondi,mese,giorno,anno)
            //faccio la differenza dei due timestamp
            
    $diff mktime($arr[0],$arr[1],0,1,1,2004) - mktime($part[0],$part[1],0,1,1,2004);
            
    //decodifico il timestamp in ore e minuti
            
    $tempo floor($diff / (60*60)).":".(($diff 60) % 60);

            return 
    $tempo;
           

    Funzia alla grande ma ora mi servirebbe calcolare l'intrervallo di tempo tra i vari elementi del seguente array:

    Codice PHP:
    Array
    (
        [
    0] => 2013-08-18 08:30:00
        
    [1] => 2013-08-18 10:30:00
        
    [2] => 2013-08-18 17:30:00
        
    [3] => 2013-08-19 08:40:00

    L'array è generato da una query su una tabella mysql quindi posso calcolare il numero degli oggetti che si creano dentro l'array ogni volta per fare un eventuale loop e chiamare la funzione conta_ore per ogni istanza ma non ne vengo fuori...

    Qualche suggerimento?
    Grazie in anticipo!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Dimenticavo di dire che l'operazione mi serve solo se un elemento dell'array avviene lo stesso giorno dell'elemento successivo...infatti la funzione non calcola la differenza temporale considerando i giorni ma solo le ore...

  3. #3
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,361
    Prova questo

    codice:
    <?php
    date_default_timezone_set('Europe/Rome') ;
    $d1 = new DateTime('2013-08-01 19:30:00'); 
    $d2 = new DateTime('2013-08-10 7:00:00'); 
    $diff = $d1->diff($d2); 
    $diffa = $d1->diff($d2); 
    $diffm = $d1->diff($d2); 
    $diffh = $d1->diff($d2); 
    $diffi= $d1->diff($d2); 
    $diffs = $d1->diff($d2); 
    
    
    echo $nb_jours = $diff->d." Giorni "; 
    echo $nb_mois = $diffm->m." mesi "; 
    echo $nb_an = $diffa->y." anni "; 
    echo "
    ";
    echo $nb_heur = $diffh->h." Ore "; 
    echo $nb_min = $diffi->i." Minuti "; 
    echo $nb_sec = $diffs->s." Secondi ";
     
    ?>
    Provenienza : http://www.commentcamarche.net/forum...-entre-2-dates
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Ciao badaze! Innanzittutto grazie per la risposta. Mi sembra peró che questo sia un metodo alternativo (più completo) di calcolare la differenza di tempo tra due variabili.
    Ció che non riesco a fare io è calcolare la differenza tra le date presenti dentro ad un array come quello che ho postato. Dovrebbe farlo ciclicamente: differenza tra prima e seconda, differenza tra seconda e terza e cosí via finché non finiscono. Dovrei stampare il risultato in una tabella quindi dovrebbe essere un altro array...

  5. #5
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,361
    Cosi allora ?

    Codice PHP:
    <?php
    function conta_ore($start$end) { 
        return 
    "diff $start - $end
    "
    ;
    }

       
    $A[0] = "2013-08-18 08:30:00";
       
    $A[1] = "2013-08-18 10:30:00";
       
    $A[2] = "2013-08-18 17:30:00";
       
    $A[3] = "2013-08-19 08:40:00";

    $j count($A) - 2;
    $ris = array();
    for (
    $i=0;$i<=$j;$i++) {
        
    $ris[] = conta_ore($A[$i],$A[$i+1]);
    }

    print_r($ris);
    ?>
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Questo script è mooolto interessante! Grazie! Appena ho un attimo provo ad inserirlo alla mia pagina e ti faccio sapere.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Con questo non mi hai aiutato solo per questo problema ma mi hai chiarito una volta per tutte come mettere in ciclo il risultato di un array e farne ciò che voglio! So che per qualcuno sarà banale ma ho iniziato con php da soli due mesi (a lavoro uso pl-sql di oracle)...
    Grazie mille per il preziosissimo aiuto!

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Lo script di prima è stato utilissiomo ad inserire in una tabella il risultato.

    Ora il fine è ottenere un "SI" associato ai cod_id delle riunioni che hanno ora di convocazione a più di tot ore l'una dall'altra per poi filtrare solo quelle in una seconda query. O si può farlo in modo più semplice? Il mio approccio (forse sbagliato) è il seguente:

    Sto facendo una funzione che controlla le date inizio delle riunioni.
    A fronte di una serie di cod id delle riunioni (avse_cod_id) passate da un altra pagina, la funzione dovrebbe restituirmi solo i cod id delle riunioni che hanno data di convocazione (avse_inizio) inferiore di 4 ore l'un l'altra. Questo proverò a farlo poi nella funzione diffnumore facendomi tornare un si/no al conteggio di 4 ore.
    Qui direi mi basterebbe riuscire a stampare l'array $ris in fondo alla funzione anche con i cod id dei risultati oltre che con il conteggio delle ore.
    Se però alla funzione diffnumore passo l'array anche il cod id facendo:
    $A[$avse_cod_id)] = ($avse_inizio); invece di
    $A[] = ($avse_inizio); non mi fa più il conteggio sulla differenza tempo.

    Questo è il php della funzione:

    Codice PHP:
    //con questa query estraggo tutte le sedute che hanno i cod_id uguali a quelli passati dalla pagina
    $sedutedacontrollare "SELECT avse_cod_id, avse_inizio FROM avse_sedute WHERE avse_cod_id IN (".implode(',',$A).") ORDER BY avse_inizio";
    $result mysql_query($sedutedacontrollare) or die(mysql_error($db));
    while(
    $row=mysql_fetch_array($result)){
        
    extract($row);
        
        
    $avse_cod_id = ($row['avse_cod_id']);
        
    $avse_inizio = ($row['avse_inizio']);
        
        
    $A[] = ($avse_inizio); //qui creo array che contiene le date da controllare
    }

    //metto in ciclo e controllo con la funzione diffnumeroore
    $j count($A) - 2;
    $ris = array();
    for (
    $i=0;$i<=$j;$i++) {
    $ris[] = diffnumeroore($A[$i],$A[$i+1]);
    }

    //stampo i risultati
    echo "<pre>";
    print_r($ris);
    echo 
    "</pre>"
    Come posso far tornare dentro ad $ris anche avse_cod_id della riunione su cui ha eseguito il conteggio?
    Un risultato tipo:
    avse_cod_id1 - dalla precedente sono trascorse diffnumeroore1
    avse_cod_id2 - dalla precedente sono trascorse diffnumeroore2
    avse_cod_id3 - dalla precedente sono trascorse diffnumeroore3


  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,361
    Un array che contiene un array.

    Codice PHP:
    <?php
    function conta_ore($start$end) { 
        
    $oraStart $start["inizio"];
        
    $oraEnd   $end["inizio"];
        
    $idSala   $start["sala"];

        
    $diff "diff $oraStart - $oraEnd
    "
    ;
        
    $sala "sala $idSala";
        return array(
    "sala"=>$sala,"diff"=>$diff);
    }

       
    $A[0] = array("inizio" => "2013-08-18 08:30:00","sala" => 1);
       
    $A[1] = array("inizio" => "2013-08-18 10:30:00","sala" => 2);
       
    $A[2] = array("inizio" => "2013-08-18 17:30:00","sala" => 1);
       
    $A[3] = array("inizio" => "2013-08-19 08:40:00","sala" => 3);

    $j count($A) - 2;
    $ris = array();
    for (
    $i=0;$i<=$j;$i++) {
        
    $ris[] = conta_ore($A[$i],$A[$i+1]);
    }

    //print_r($ris);
    foreach ($ris as $key => $value) {
        
    print_r($value);
    }
    ?>
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2013
    Messaggi
    9
    Tu sei un genio!
    Provo ad applicare e poi posto se ci sono riuscito!
    Grazie!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.