[RISOLTO] Problema Griglia Php+Mysql

Discussione in 'PHP' iniziata da killu, 11 Giugno 2019.

  1. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Salve, sono totalmente in panne, dovrei eseguire un estrazione da un db Mysql come quella allegato,
    non so come fare, ho provato a cercare ovunque ma non ho trovato nulla che possa aiutarmi, il problema è che non so come riuscire a mettere i risultati per data in base all'esame
     

    Files Allegati:

  2. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    I dati come sono memorizzati?
     
  3. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    1 tabella mysql
    all' interno c'è:
    campo descrizione
    campo data
    campo valori
     
  4. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    Prima di tutto conviene creare un nuovo array associativo con chiave "esame + data" per semplificare la ricerca, quindi ipotizzando di avere tutti i dati nella variabile $db farei come segue:
    PHP:
    /**
    * Crea un nuovo array
    */
    function MakeKeyArrayFromArr($array,$keys=[]){
       
    $data=[];
       foreach (
    $array as $items){
          
    $temp='';
          foreach (
    $keys as $value){
             
    $temp.=$items[$value];
          }
          
    $data[$temp]=$items;
       }
       return 
    $data;
    }
    $db=MakeKeyArrayFromArr($db,['descrizione','data']);
    //prelevo tutte le data disponibili uniche per creare il numero di colonne esatto
    $date=array_unique(array_column($db,'data'));
    //prelevo tutti gli esami unici per scorrere successivamente le righe
    $esami=array_unique(array_column($db,'descrizione'));
    La filosofia è semplice:
    Inizio ad iterare sugli esami, continuo l'iterazione con le date e prelevo il dato (se esiste) dall'array creato con "MakeKeyArrayFromArr", altrimenti la cella sarà vuota.

    PHP:
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" type="text/css">
    <table class="table table-bordered table-striped">
       <thead>
       <tr>
          <th></th>
          <th colspan="<?php echo count($date)?>">Valori Esami</th>
       </tr>
       <tr>
          <th></th>
          <th colspan="<?php echo count($date)?>">Esami</th>
       </tr>
       <tr>
          <th>Esami</th>
          <?php
             
    foreach ($date as $datum){
                echo 
    '<th>'.$datum.'</th>';
             }
          
    ?>
       </tr>
       </thead>
       <tbody>
       <?php
          
    foreach ($esami as $esame){
             
    $row='<tr><td>'.$esame.'</td>';
             foreach (
    $date as $datum){
                
    $s=$db[$esame.$datum]['valori']??'';
                
    $row.='<td>'.$s.'</td>';
             }
             
    $row.='</tr>';
             echo 
    $row;
          }
       
    ?>
       </tbody>
    </table>
    Ti lascio lo script completo qui con la generazione dei dati fake per vedere come funziona.
    PHP:
    <?php
    function creaDateFake($in,$first_date='2019-01-01'){
       
    $d1=new DateTime($first_date);
       return 
    $d1->add(new DateInterval('P'.$in.'D'))->format('Y-m-d');

    }
    function 
    creaDati($esami){
       
    $data=[];
       foreach (
    $esami as $esame){
          
    $rand=rand(5,15);
          
    $current_date='2019-01-01';
          for(
    $i=0;$i<$rand;$i++){
             
    $current_date=creaDateFake(rand(1,3),$current_date);
             
    $data[]=
                [
                   
    'descrizione'=>$esame,
                   
    'data'=>$current_date,
                   
    'valori'=>rand(10,250)
                ];
          }
       }
       return 
    $data;
    }
    $esami=[];
    for(
    $i=0;$i<10;$i++){
       
    $esami[]='esami '.$i;
    }
    $db=creaDati($esami);
    function 
    MakeKeyArrayFromArr($array,$keys=[]){
       
    $data=[];
       foreach (
    $array as $items){
          
    $temp='';
          foreach (
    $keys as $value){
             
    $temp.=$items[$value];
          }
          
    $data[$temp]=$items;
       }
       return 
    $data;
    }
    $db=MakeKeyArrayFromArr($db,['descrizione','data']);
    $date=array_unique(array_column($db,'data'));
    $esami=array_unique(array_column($db,'descrizione'));
    ?>
    <table>
       <thead>
       <tr>
          <th></th>
          <th colspan="<?php echo count($date)?>">Valori Esami</th>
       </tr>
       <tr>
          <th></th>
          <th colspan="<?php echo count($date)?>">Esami</th>
       </tr>
       <tr>
          <th>Esami</th>
          <?php
             
    foreach ($date as $datum){
                echo 
    '<th>'.$datum.'</th>';
             }
          
    ?>
       </tr>
       </thead>
       <tbody>
       <?php
          
    foreach ($esami as $esame){
             
    $row='<tr><td>'.$esame.'</td>';
             foreach (
    $date as $datum){
                
    $s=$db[$esame.$datum]['valori']??'';
                
    $row.='<td>'.$s.'</td>';
             }
             
    $row.='</tr>';
             echo 
    $row;
          }
       
    ?>
       </tbody>
    </table>
     
    Ultima modifica: 13 Giugno 2019
  5. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Non ho capito come creare ciò
     
  6. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    "MakeKeyArrayFromArr"

    Ipotizzando di avere tutti i risultati dalla query....
    PHP:
    //risultato da query
    $result=
    [
        [
    'descrizione'=>'esame 0','data'=>'2019-01-01','valore'=>5],
    [
    'descrizione'=>'esame 1','data'=>'2019-01-03','valore'=>15],
    [
    'descrizione'=>'esame 2','data'=>'2019-01-02','valore'=>25],
    [
    'descrizione'=>'esame 3','data'=>'2019-01-05','valore'=>35],
    ];
    //Crea il nuovo array con chiave la concatenazione delle chiavi passate in keys
    function MakeKeyArrayFromArr($array,$keys=[]){
       
    $data=[];
       foreach (
    $array as $items){
          
    $temp='';
          foreach (
    $keys as $value){
             
    $temp.=$items[$value];
          }
          
    $data[$temp]=$items;
       }
       return 
    $data;
    }
    //Risultato funzione
    $result=MakeKeyArrayFromArr($result,['descrizione','data']);
    //Risultato esempio
    $result=
    [
        
    'esame 02019-01-01'=>['descrizione'=>'esame 0','data'=>'2019-01-01','valore'=>5],
        
    'esame 12019-01-03'=>['descrizione'=>'esame 1','data'=>'2019-01-03','valore'=>15]
    ];

    In questo modo abbiamo ottenuto l'array associativo.... Chiave - Valore.

    Nello script manca l'ordinamento, e la gestione duplicati da parte di più controlli giornalieri...
    Mi sono basato su quanto richiesto!
     
  7. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Dovrei indicare io le date, immettendole manualmente nell array?
     
  8. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    ???
    ----------------------------
    Scusami, se fai l'estrazione dal DB avrai una situazione del genere
    PHP:
    $risultato_array_da_query=[
     [
    'descrizione'=>'esame 0','data'=>'2019-01-01','valore'=>5],
    ......
    ];
    Ora se io non volessi le chiavi dell'array del tipo [0,1,2,3,...n] ma associativa?
    Entra in gioco la funzione MakeKeyArrayFromArr,
    dove come primo argomento viene passato il risultato totale della query "risultato_array_da_query" e come secondo viene passato l'array di elementi sul quale creare DINAMICAMENTE la chiave, in questo caso "['descrizione','data']".....
    Quindi invece di accedere all'array in questo modo:
    PHP:
    //NO BUONO
    print_r($risultato_array_da_query[0]);
    //SI ACCEDE IN QUESTO MODO
    print_r($risultato_array_da_query['esame 02019-01-01']);
    Dove la chiave non la scrivi tu ma viene creata dinamicamente dai due cicli annidati tra "ESAME" e "DATE"....

     
    Ultima modifica: 13 Giugno 2019
  9. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Da come hai capito sono una totale frana utilizzando gli array, potresti dirmi come costruire anche la query per l'estrapolazione dal db?:(
     
  10. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    $sql = "SELECT descrizione, data, valori FROM griglia";

    $result = $dbo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    $return = [];
    foreach ($result as $row) {
    $array[] = [

    'descrizione' => $row['descrizione'],
    'esame' => $row['esame'],
    'valori' => $row['valori']

    ];
    }

    Utilizzando ciò con il tuo script iniziale non mi viene stampato nulla
     
  11. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    Se il modello è identico non vedo perchè non dovrebbe funzionare....
    Non so come hai strutturato il tutto, prova a fare un print di result.... altra nota... non è necessario passare il risultato da result a $array, è inutile, in quanto identico stando a quello che hai asserito nel 3° post!
     
  12. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Eseguendo il print($result)
    Il codice completo che mi hai dato

    i nomi dei campi sono cambiati, ma non penso sia quello il problema, essendo che li ho cambiati ovunque, le date all'interno del db sono in formato dd/mm/yy
     
  13. macus_adi

    macus_adi Utente Attivo

    Registrato:
    5 Dicembre 2017
    Messaggi:
    882
    Mi Piace Ricevuti:
    49
    Punteggio:
    28
    Sesso:
    Maschio
    Occupazione:
    Developer
    Località:
    L'Aquila
    no il problema è questo:
    stai passando "$db" che non hai dichiarato, non puoi utilizzare le mie var se tu cambi il nome...
    Ossia tu il risultato non l'hai messo in $db ma in result..... Quindi
    PHP:
    $db=MakeKeyArrayFromArr($db,['sotto_esame','data_esame']);
    //prelevo tutte le data_esame disponibili uniche per creare il numero di colonne esatto
    $date=array_unique(array_column($db,'data_esame'));
    //prelevo tutti gli esami unici per scorrere successivamente le righe
    $esami=array_unique(array_column($db,'sotto_esame'));
    Deve diventare così
    PHP:
    $db=MakeKeyArrayFromArr($result,['sotto_esame','data_esame']);
    //prelevo tutte le data_esame disponibili uniche per creare il numero di colonne esatto
    $date=array_unique(array_column($result,'data_esame'));
    //prelevo tutti gli esami unici per scorrere successivamente le righe
    $esami=array_unique(array_column($result,'sotto_esame'));
     
  14. killu

    killu Nuovo Utente

    Registrato:
    11 Giugno 2019
    Messaggi:
    9
    Mi Piace Ricevuti:
    0
    Punteggio:
    1
    Sesso:
    Maschio
    Non so come ringraziarti, sta funzionando alla perfezione..
    Grazie mille Macus:)
     
Sto caricando...

Condividi questa Pagina