[RISOLTO] Problema Griglia Php+Mysql

  • Creatore Discussione Creatore Discussione killu
  • Data di inizio Data di inizio

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

  • griglia esami.JPG
    griglia esami.JPG
    74 KB · Visite: 622
1 tabella mysql
all' interno c'è:
campo descrizione
campo data
campo valori
 
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:
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!
 
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:
Da come hai capito sono una totale frana utilizzando gli array, potresti dirmi come costruire anche la query per l'estrapolazione dal db?:(
 
$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
 
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!
 
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
 
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'));
 

Discussioni simili

M
Risposte
12
Visite
3K
HTML e CSS
Membro cancellato 26246
M