sempre per Griglia in stile MySQL

Salve a tutti,

sono in panne con uno script per creare una griglia semplice ma tanto complessa nello stesso tempo. Non riesco a creare i riporti per 2 semplici colonne.

La colonna A possiede le etichette e la colonna B i dati. Potete aiutarmi per favore?!

Ecco quello che vorrei realizzare:

                                 |                 
                         Pagella |                 
                                 |                 
                   Dati Studente |                 
                  Nome & Cognome | Alessio Del Duca 
                           Città | Roma
                           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 

ecco il codice che sono riuscito a creare:

<?php

function texttable($dati)
{
   header("Content-type:text/plain");
   $separatore = "";
   $max_lunghezza = array();

   $max_lunghezza[0] = 25;
    $max_lunghezza[1] = 60;

   foreach ($dati as $riga)
   {
      for ($i=0,$n=count($riga) ; $i < $n ; $i++)
      {
         if($i == 0){ 
                if(strlen($riga[$i]) < $max_lunghezza[$i]){
                    echo str_pad($riga[$i] ." ", $max_lunghezza[$i], ' ',  STR_PAD_LEFT);       // Colonna Etichette
                }else{
                    $arrSentences = CropSentence($riga[$i],$max_lunghezza[$i],"");
                    echo str_pad($arrSentences[0] ." ", $max_lunghezza[$i], ' ',  STR_PAD_LEFT);
                }
            }else{
                echo '| ' . str_pad($riga[$i], $max_lunghezza[$i], ' ',  STR_PAD_RIGHT);    // Colonna Dati    
                
               
            }
      }
      echo " \n";
        flush(); 
   }
   echo $separatore;
   
}

    function CropSentence ($strText, $intLength) 
    {
        $wsCount = 0;
        $intTempSize = 0;
        $intTotalLen = 0;
        $strTemp = "";
        $CropSentence = Array();
        
        if (strlen($strText) > $intLength) {
            $arrTemp = explode(" ", $strText);
            foreach ($arrTemp as $x) {
                if (strlen($strTemp) < $intLength) {
                    if (strlen($strTemp . $x . " ") < $intLength) { 
                        $strTemp .= $x . " ";
                        }else{
                        $CropSentence[] = trim($strTemp);
                        $strTemp = $x . " ";
                    }
                }else{
                    $CropSentence[] = trim($strTemp);
                    $strTemp = $x;
                }
            }
            $CropSentence[] = trim($strTemp);
        } else {
            $CropSentence[] = $strText;
        }

        return $CropSentence;
    }

texttable(array(            
            array('Dati Studente',''),
         array('Nome & Cognome','Alessio Del Duca'),
            array('Città','Roma'),
            array('Stato','Italia'),
            array('',''),
            array('Dati dello studente del primo quadrimestre',''),
            array('Italiano','Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo '),
            array('Analisi di Matematica','Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo ')
            )
        );
        
        
?>

Questo post è la prolungazione del post: http://www.phpnews.it/forum/index.php?topic=813.new#new

A presto

 :bye:

inviato 10 anni fa
ulisse
modificato 10 anni fa
X 0 X
<?php
function texttable($dati)
{
   header("Content-type:text/plain");

   $max_lunghezza[0] = 25;
   $max_lunghezza[1] = 60;

   // per prima cosa mando "a capo" le stringhe lunghe
   for ($i=0, $n=count($dati) ; $i < $n ; $i++)
   {
      $dati[$i][0] = wordwrap($dati[$i][0],$max_lunghezza[0]);
      $dati[$i][1] = wordwrap($dati[$i][1],$max_lunghezza[1]);

      $campo = explode("\n",$dati[$i][0]);
      $valore = explode("\n",$dati[$i][1]);

      for ($j=0, $m=max(count($campo),count($valore)) ; $j < $m ; $j++)
      {
         $c = isset($campo[$j]) ? str_pad($campo[$j],$max_lunghezza[0],' ',STR_PAD_LEFT) : str_repeat(' ',$max_lunghezza[0]);
         $v = isset($valore[$j]) ? str_pad($valore[$j],$max_lunghezza[1],' ',STR_PAD_RIGHT) : '';
         echo "$c | $v\n";
      }
   }
}

texttable(array(
   array('Dati Studente',''),
   array('Nome & Cognome','Alessio Del Duca'),
   array('Città','Roma'),
   array('Stato','Italia'),
   array('',''),
   array('Dati dello studente del primo quadrimestre',''),
   array('Italiano','Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo '),
   array('Analisi di Matematica','Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo Testo ')
));
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
modificato 10 anni fa
X 0 X

Grazie Mille Gianni mi hai salvato la vita ... spero un giorno di offrirti almeno un caffè!  :)

A presto

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Ciao Gianni,

volevo chiederti un particolare della funzione che hai creato. I dati che recupero sono in utf8. Ho notato che dopo aver recuperato i dati le barrette verticali si spostano verso sinistra se vi è un carattere utf8 in corrispondenza dell'etichetta.

Ti faccio un esempio.

Guarda la barretta verticale e noterai che in corrispondenza dell'etichetta "Attività artistica" si sposta verso sinistra.

Che cosa è successo?!

Grazie del tuo aiuto
Ulisse  :bye:

                                 |                 
                         Pagella |                 
                                 |                 
                   Dati Studente |                 
                  Nome & Cognome | Alessio Del Duca 
                           Città | Roma
                           Stato | Italia           
                        Telefono | 06892424         
             Pagella dell'ultimo |           
                    quadrimestre |                 
                                 |                 
                        Italiano | 6,5                
                          Storia | 5,8                
                      Matematica | 7,4                
                                 |                 
             Attività Artistica |                 
                                 | 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 
                                 |                 
            Attività Agonistica |                 
                                 | 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

Il problema è che le funzioni per la gestione delle stringhe in PHP non funzionano correttamente con l'utf8, in particolare quando devono calcolare o lavorare sulla lunghezza delle stringhe.   :dunno:

Nel tuo caso credo sia la funzione str_pad a "dare i numeri". Una soluzione potrebbe essere convertire le stringhe con iconv.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni,

ho provato ad inserire il codice all'interno del ciclo ma niente da fare. La situazione peggiora.  Il db è impostato per supportare utf8. La collation è utf8_general_ci.

                        if (isset($campo[$j])){
                           $campo[$j] = iconv("ISO-8859-1", "UTF-8", $campo[$j]);                        
                        }
                                 |                 
                         Pagella |                 
                                 |                 
                   Dati Studente |                 
                  Nome & Cognome | Alessio Del Duca 
                           Città | Roma
                           Stato | Italia           
                        Telefono | 06892424         
             Pagella dell'ultimo |           
                    quadrimestre |                 
                                 |                 
                        Italiano | 6,5                
                          Storia | 5,8                
                      Matematica | 7,4                
                                 |                 
             Attività Artistica |                 
                                 | 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 
                                 |                 
            Attività Agonistica |                 
                                 | 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
modificato 10 anni fa
X 0 X

Hai invertito l'ordine dei set di caratteri. Devi eseguire:

iconv("UTF-8", "ISO-8859-1", $campo[$j]);

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie mille... siamo vicino alla verità:

ma ho trovato un errore:

Notice</b>:  iconv(): Detected illegal character in input string ...

Che cosa significa?

Grazie

Ulisse

risposto 10 anni fa
ulisse
X 0 X

forse la stringa passata non è in utf8?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

C'è modo per poter controllare il formato?!!?

a me sembra in utf8.

 :-\

risposto 10 anni fa
ulisse
X 0 X

 :dunno:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Non riesco a capire quale carattere lo fa impazzire!!  :'(

Notice</b>:  iconv(): Detected illegal character in input string ...

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Ecco il carattere infame. I browser lo renderizza come un semplice trattino ma iconv non lo riconosce e genera l'errore!!

â

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Tutto risolto quindi?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Apparentemente si. Grazie mille Gianni.

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Pensavo di aver risolto il problema, ma iconv() ha delle difficoltà con i caratteri diversi dall'inglese. Diciamo che non supporta bene l'utf8 oppure sono io una schiappa.  :uglystupid:

dovrei scrivere sia in italiano ma anche in altre lingue soprattutto dell'est europa. Che cosa posso fare? I caratteri non inglesi non vengono riconosciuti. Possiamo aggirare il problema?

Grazie Gianni

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Secondo me il problema è capire esattamente qual'è la codifica adottata dalle stringhe. Da dove prelevi i dati? Un DB? Quale?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

il db è un MySql e la codifica è utf8_general_ci.

Che posso fare?!

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Ma non esiste una alternativa al str_pad che ci consente di leggere qualsiasi tipo di carattere unicode?!  ???

 :bye:

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