[RISOLTO] Problema Griglia Php+Mysql

killu

Nuovo Utente
11 Giu 2019
9
0
1
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
 

Allegati

killu

Nuovo Utente
11 Giu 2019
9
0
1
1 tabella mysql
all' interno c'è:
campo descrizione
campo data
campo valori
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
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:

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Non ho capito come creare ciò
"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!
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
Dovrei indicare io le date, immettendole manualmente nell array?
???
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.
----------------------------
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"....

Ti lascio lo script completo qui con la generazione dei dati fake per vedere come funziona.
 
Ultima modifica:

killu

Nuovo Utente
11 Giu 2019
9
0
1
Da come hai capito sono una totale frana utilizzando gli array, potresti dirmi come costruire anche la query per l'estrapolazione dal db?:(
 

killu

Nuovo Utente
11 Giu 2019
9
0
1
$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
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
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!
 

killu

Nuovo Utente
11 Giu 2019
9
0
1
Eseguendo il print($result)
Array ( [0] => Array ( [data_esame] => 24/07/2016 [sotto_esame] => TOTALE [ris_num] => 0.86 ) [1] => Array ( [data_esame] => 23/07/2016 [sotto_esame] => DIRETTA [ris_num] => 0.24 ) [2] => Array ( [data_esame] => 25/07/2016 [sotto_esame] => INDIRETTA [ris_num] => 0.62 ) [3] => Array ( [data_esame] => 25/07/2016 [sotto_esame] => GLOBULI BIANCHI WBC [ris_num] => 9.16 ) [4] =>
Il codice completo che mi hai dato

PHP:
<?
include 'connect_db.php';
/**
* Crea un nuovo array
*/

$sql = "SELECT data_esame,sotto_esame,ris_num FROM griglia";

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

        'data_esame' => $row['data_esame'],
        'sotto_esame' => $row['sotto_esame'],
        'valori' => $row['ris_num']

    ];
}
//echo json_encode($return);
print_r($result);



function MakeKeyArrayFromArr($array,$keys=[]){
   $data_esame=[];
   foreach ($array as $items){
      $temp='';
      foreach ($keys as $value){
         $temp.=$items[$value];
      }
      $data_esame[$temp]=$items;
   }
   return $data_esame;
}
$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'));

?>
<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>
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
 

macus_adi

Utente Attivo
5 Dic 2017
1.313
88
48
IT/SW
no il problema è questo:
stai passando "$db" che non hai dichiarato, non puoi utilizzare le mie var se tu cambi il nome...
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:
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'));
 

killu

Nuovo Utente
11 Giu 2019
9
0
1
Non so come ringraziarti, sta funzionando alla perfezione..
Grazie mille Macus:)