Griglia in style Mysql dos client.

Salve,

avete presente il risultato dopo una "Select" del client dos di MySQL quando viene effettuata una query?! Crea una griglia in solo testo che rappresenta la tabella del db. E' possibile realizzare una classe che crei tabelle in solo testo facendo attenzione alle dimensioni dei testi in essa contenuti!?

Grazie mille

Ulisse

inviato 10 anni fa
ulisse
X 0 X

Non sarebbe difficile realizzarla, basta calcolare la lunghezza del dato più lungo per ciascuna colonna con la funzione

$max = strlen((string)$dato_lungo)

e poi aggiungere un numero di spazi adeguati ai dati meno corti con

str_pad($dato, $max - strlen((string)$dato), ' ', STR_PAD_LEFT)

Prova a realizzare lo script e se ci sono problemi riporta il codice.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ecco un esempio. Qualcuno mi può aiutare?!

<?
/**
 * Function to convert arrays of hashes (e.g. SQL results sets) into
 * MySQL-style formatted text columns, with wordwrap of length
 * specified by the optional 2nd argument.
 */

function texttable($s,$max_width=75) {

  header("Content-type:text/plain");

  foreach($s as $i=>$row) {
    foreach($row as $name=>$field) {
      $headerrow[$name][0]=$name;
      $lines=explode("\n",str_replace("\r","",$field));
      $fields[$i][$name]=$lines;
      foreach ($lines as $line)
    $width[$name]=min($max_width,max($width[$name],strlen($line)));
    }
  }
  array_unshift($fields,$headerrow);

  $rule="+";
  foreach ($width as $w) $rule.=str_repeat("-",$w+2)."+";
  echo "$rule\n";

  foreach($fields as $i=>$row) {
    $temp=array();
    foreach($row as $name=>$field) {

      foreach($field as $line)
    $temp[$name]=array_merge($temp[$name],explode("\n",wordwrap($line,$width[$name],"\n")));
    }

    for ($j=0,$text=true;$text;$j++) {
      $line="|";
      $text=false;
      foreach($temp as $name=>$null) {
    if ($j<count($temp[$name])) $text=true;
    $line.= " ".$temp[$name][$j].str_repeat(" ",$width[$name]-strlen($temp[$name][$j]))." |";
      }
      if ($text) echo "$line\n";
    }
    echo "$rule\n";
  }
}

echo texttable(array(array("Field1"=>"Cell 1","Field2"=>"Cell 2"),
             array("Field1"=>"Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. ",
               "Field2"=>"And also this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. Long text in this cell. ")
             ),30);
?>
risposto 10 anni fa
ulisse
X 0 X

Ho buttato giù questo script

<?php
function texttable($campi,$dati)
{
   header("Content-type:text/plain");
   
   $max_lunghezza = array();
   
   for ($i=0,$n=count($campi) ; $i < $n ; $i++)
   {
      $max_lunghezza[$i] = strlen((string)$campi[$i]);
   }
      
   foreach ($dati as $riga)
   {
      for ($i=0,$n=count($riga) ; $i < $n ; $i++)
      {
         $lunghezza_dato = strlen((string)$riga[$i]);
         if($max_lunghezza[$i] < $lunghezza_dato) $max_lunghezza[$i] = $lunghezza_dato;
      }   
   }
   
   $separatore = '';
   foreach ($max_lunghezza as $lung_campo)
   {
      $separatore .= '+' . str_repeat('-',$lung_campo);
   }
   $separatore .= "+\n";
   
   
   echo $separatore;
   
   for ($i=0,$n=count($campi) ; $i < $n ; $i++)
   {
      echo '|' . str_pad($campi[$i], $max_lunghezza[$i], ' ',  STR_PAD_LEFT);
   }
   echo "|\n";
   
   echo $separatore;
   
   foreach ($dati as $riga)
   {
      for ($i=0,$n=count($riga) ; $i < $n ; $i++)
      {
         echo '|' . str_pad($riga[$i], $max_lunghezza[$i], ' ',  STR_PAD_LEFT);
      }
      echo "|\n";
   }
   echo $separatore;
   
}
texttable(array('campo 1', 'field 2', 'nome'),
      array(array(1,123,'ciccio'),
         array(21321,1,'alessio'),
         array(123,4321,'bo')));
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni!!!

Sto cercando di impostare la grafica che deve uscire. Vorrei creare questo:

    Etichette | Valori

 Etichetta 2 | Valore

 Etichetta 3 | Valore

 Etichetta 4 | Valore

 Etichetta 5 | Valore

con un allineamento per le etichette a destra e per i valori a sinistra.  Sto cercando di capire come hai creato la classe ma tutte le funzioni di php non le conosco.

La tua funzione pone gli elementi a destra sia per le etichette che per i valori. Credi sia possibile impostare quella visualizzazione che ti ho scritto su?

Grazie mille del tuo aiuto.

Ulisse

risposto 10 anni fa
ulisse
X 0 X

L'allineamento è solo un "effetto ottico" ottenuto facendo precedere (alllineamento a destra) o seguire (all. a sinistra) un numero opportuno di spazi alla parola in questione.

Tutto il meccanismo si basa sul calcolo della dimensione delle singole colonne, che deve essere sufficiente a contenere la parola più lunga presente nella stessa colonna. Fatto ciò per inserire un numero di spazi adeguato ho usato la funzione str_pad a cui ho passato la dimensione della colonna prima calcolata e ho specificato che gli eventuali spazi che avrebbe aggiunto dovevano essere inseriti a sinistra (STR_PAD_LEFT).

Comunque per i dettagli su questa funzione ti consiglio di spulciarti la documentazione ufficiale:

http://it.php.net/manual/en/function.str-pad.php

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni,

sto cercando di modificare lo script e mi sono trovato in una situazione non facile.

Tutto il meccanismo si basa sul calcolo della dimensione delle singole colonne, che deve essere sufficiente a contenere la parola più lunga presente nella stessa colonna.

Ponendo per caso che la tabella ha 2 colonne [A, B] con n righe. Nella colonna "A" l'etichetta è molto lunga quindi per evitare una colonna larghissima dovrei spezzare il testo alla fine di una certa parola e mettere accapo le rimanenti parole.

Come devo impostare le proprietà delle colonne come la larghezza e l'allineamento del testo ? :-\

Mi sto studiando la funzione che mi hai detto str-pad, e trovo alcune difficoltà nel realizzare le cose sopra indicate.

Scusami tanto ma non sono molto bravo con il php sto cercando di imparare. Grazie Mille.

Ulisse

risposto 10 anni fa
ulisse
X 0 X

sono riuscito a far questo ma non è quello che desidero!  :-\

|                                |                 
|                       etichette|                 
|                                |                 
|Dati Studente                   |                 
|Nome & Cognome                  |Alessio Del Duca 
|Città                           |Catania          
|Stato                           |Italia           
|Telefono                        |06892424         
|Pagella dell'ultimo quadrimestre|                 
|                                |                 
risposto 10 anni fa
ulisse
modificato 10 anni fa
X 0 X

Ecco quello che vorrei realizzare:

                                 |                 
                         Pagella |                 
                                 |                 
                   Dati Studente |                 
                  Nome & Cognome | Alessio Del Duca 
                           Città | Catania          
                           Stato | Italia           
                        Telefono | 06892424         
Pagella dell'ultimo quadrimestre |                 
                                 |                 
                        Italiano | 6,5                
                          Storia | 5,8                
                      Matematica | 7,4                
                                 |                 
                 Giudizio Finale |                 
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
                                 | Testo testo testo testo testo  |
risposto 10 anni fa
ulisse
X 0 X

Quindi in realtà vuoi mostrare solo un array di etichette associato ad un array di valori? Questo equivale a supporre che la SELECT restituisca una sola riga, giusto?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Si, ho un insieme di dati.

La query risponde un array di valori. Creare la struttura è un pò difficile ... non riesco a capire come fare.

Ti ringrazio del tuo aiuto

Ulisse

risposto 10 anni fa
ulisse
modificato 10 anni fa
X 0 X

Sto impazzendo! E' un giorno che sono dietro a sta roba! Mi girano gli occhi.  :uglystupid:

risposto 10 anni fa
ulisse
X 0 X

Ciao Gianni potresti aiutarmi nel realizzarla?! Non riesco ad andare avanti.  :buck:

Grazie

Ulisse

risposto 10 anni fa
ulisse
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda