Ciao a tutti.
Ho creato uno script per visualizzare la lista delle province italiane, ordinate per regione.

Codice PHP:
<select name="provincia">
    <option value="0" disabled="disabled">Seleziona una provincia</option>
    <?php
        
include "connessione.php";
        
$sql="SELECT * FROM `regioni_province`";
        
        
$risultato=@mysql_query($sql,$connessione);
        if (!
$risultato) {
            die (
"errore: lettura del db non riuscita.");
        }
        
        
$rows_counter 0;
        
$rows=@mysql_num_rows($risultato);

        
$row1st mysql_fetch_row($risultato);
        
$rows_counter++;
        
$id=$row1st[0];
        
$regione_precedente=$row1st[1];
        
$provincia=$row1st[2];
        
$sigla_auto=$row1st[3];
    
?>

    <optgroup label="<?php echo $regione_precedente?>">
        <option value="<?php echo $sigla_auto?>"><?php echo $provincia." (".$sigla_auto.")"?></option>

    <?php
        
        $j 
0;
        
        while (
$rows_counter $rows)
        {
            
$row=mysql_fetch_row($risultato);
            
$rows_counter++;
            
$id=$row[$j++];
            
$regione=$row[$j++];
            
$provincia=$row[$j++];
            
$sigla_auto=$row[$j++];
            
$j 0;
            
            while (
$regione_precedente == $regione)
            {
                echo 
"<option value=\"".$sigla_auto."\">".$provincia." (".$sigla_auto.")</option>\n";
                
$row=mysql_fetch_row($risultato);
                
$rows_counter++;
                
$id=$row[$j++];
                
$regione=$row[$j++];
                
$provincia=$row[$j++];
                
$sigla_auto=$row[$j++];
                
$j 0;
            }
            echo 
"</optgroup>\n";
            if (
$rows_counter $rows) { break; }
            echo 
"<optgroup label=\"".$regione."\">\n";
            echo 
"<option value=\"".$sigla_auto."\">".$provincia." (".$sigla_auto.")</option>\n";
            
$regione_precedente $regione;
        }
        
mysql_close($connessione);
    
?>
</select>

Alla fine l'output html è simile a questo:


codice:
<select name="provincia">
<option value="0" disabled="disabled">Seleziona una provincia</option>
<optgroup label="PIEMONTE">
<option value="TO">Torino (TO)</option>
<option value="VC">Vercelli (VC)</option>
<option value="NO">Novara (NO)</option>
<option value="CN">Cuneo (CN)</option>
<option value="AT">Asti (AT)</option>
<option value="AL">Alessandria (AL)</option>
<option value="BI">Biella (BI)</option>
<option value="VB">Verbano-Cusio-Ossola (VB)</option>
</optgroup>
<optgroup label="VALLE D'AOSTA">
<option value="AO">Valle d'Aosta (AO)</option>
</optgroup>
<optgroup label="TRENTINO-ALTO ADIGE">
<option value="BZ">Bolzano (BZ)</option>
<option value="TN">Trento (TN)</option>
</optgroup>
</select>
Ho risolto in modo un po' astruso, spiego un attimo il codice:
in pratica una volta tirati giù i dati dal db, memorizzo il numero delle righe della query e mando in output la prima riga. Dopodiché faccio un ciclo che controlla ogni volta se la regione della riga che vado a inserire è la stessa della riga inserita prima: se è la stessa mando in output la riga, altrimenti significa che è iniziata una nuova regione, quindi chiudo la precedente e inizio quella nuova, continuando il ciclo esterno (fino alla fine delle righe).

Lo script funziona, ma sono sicuro che si potrebbe riscrivere in modo molto più semplice... mi aiutate?