[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

  • griglia esami.JPG
    griglia esami.JPG
    74 KB · Visite: 574

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.343
91
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.343
91
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.343
91
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.343
91
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.343
91
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:)
 
Discussioni simili
Autore Titolo Forum Risposte Data
tomorc [HTML] Problema con scroll bar (risolto) HTML e CSS 0
A [PHP] Problema query insert [RISOLTO] PHP 14
elpirata [RISOLTO][Mysql] Problema insert valori apostrofati MySQL 1
Kolop [RISOLTO][PHP] Problema Pagination PHP 2
S Problema in PHP per invio file XML - RISOLTO- PHP 8
T [Photoshop] Problema creazione pennello personalizzato [RISOLTO] Photoshop 3
F [risolto] Problema javascript Internet Explorer Javascript 1
otto9due [risolto] Problema sessioni php e login PHP 5
Alessandro Le Mura [risolto] PHP problema memorizzazione array PHP 4
S [risolto] Problema riempimento di una tabella PHP 6
P [risolto] Problema funzione raggruppamento di elementi Javascript 4
T [Javascript] [RISOLTO] Problema con Google Maps e "Zero_Results" Javascript 11
M [RISOLTO] Problema con 'a:hover' HTML e CSS 12
Virginia86 [risolto] Problema select e verifica form PHP 38
M [RISOLTO]Problema controllo e passaggio di valori da una pagina all''altra PHP 4
H [RISOLTO]Problema connessione + insert mysqli PHP 10
O [risolto] Inserimento nuovo campo in mysql. Problema PHP 6
lsnight [RISOLTO] Problema con mouseout ed immagini Javascript 2
V [RISOLTO]Problema con il POST PHP 8
A [Risolto] Problema con un list box Classic ASP 2
M [Risolto]Problema con risposta json Sviluppo app per Android 6
C [RISOLTO] Problema somma td, prende solo il primo valore jQuery 7
C Problema Risolto Flash 0
L (risolto) MySQL 0
B getElementById su piu id(Risolto) Javascript 7
L Esercitarsi con Js [RISOLTO] Javascript 4
C [RISOLTO]Inserimento variabile php in input html PHP 20
L risolto visualizzazione e ordinamento dati PHP 1
moustache [RISOLTO] SQL PHP IIS PHP 8
Sergio Unia Ricezione email con destinatari multipli [Risolto] PHP 2
L update tabelle in php mysql [risolto] PHP 6
M Semplice visualizzatore di immagini [risolto con plugin wp] PHP 7
L [RISOLTO] Stampa a video risultato count in html PHP 13
L [RISOLTO] Eliminare una discussione creata PHP 3
B [PHP] recuperare IP dei server in load balancing [RISOLTO] PHP 3
S [RISOLTO] aggiorna tabella da select option asp classic Classic ASP 7
elpirata [RISOLTO][Javascript] Datapicker e autocompletamento campo input Javascript 2
elpirata [RISOLTO][Mysql] Contare le occorrenze in un campo tipo varchar MySQL 2
G [MS Access] Gestione biglietti [RISOLTO] MS Access 2
G [MS Access] Casella combinata & Query [RISOLTO] MS Access 4
G [MS Access] Query mese corrente con conteggio [RISOLTO] MS Access 2
M [RISOLTO]Windows media player non mi funziona più su win 10 pro 64 bit Windows e Software 2
C [RISOLTO][PHP] Errore di sintassi PHP 8
IT9-Gpp [RISOLTO] Leggere variabile restituita da success Ajax 3
C [RISOLTO][PHP] Funzione ONclick PHP 14
C [RISOLTO][PHP] Conteggio righe di una tabella PHP 4
N [PHP] Utilizzo variabili di sessione [Risolto] PHP 13
Tommy03 [RISOLTO][PHP] Webserver o devserver? PHP 2
Sergio Unia Recupero dati da una vecchia versione MySql [Risolto] MySQL 4
spider81man [PHP] Problemi cancellazione dato su DB [RISOLTO] PHP 1

Discussioni simili