Problemi con array e file di testo

  • Creatore Discussione Creatore Discussione vodka
  • Data di inizio Data di inizio

vodka

Utente Attivo
25 Giu 2010
128
0
0
in riferimento all'esercio nr.28 di questo link http://www.dia.unisa.it/~parente/TSW/eserciziP.shtml

non riesco a capire dove sbaglio nel terzo script
ora vi posto i tre script.
PHP:
<html>
	<head>
		<title>Elementi da inserire</title>
	</head>
	<FORM METHOD=POST ACTION="nomi.php" name="elementi">
		<TABLE border="3" width="350" height="60">
		<TR HEIGHT="10%"><TD>Numeri di elementi da inserire:</TD><TD><INPUT TYPE="text" NAME="elementi"></TD></TR>
		<TR align="center"><TD colspan="2"><INPUT TYPE="submit" VALUE="invia" name="invia"><INPUT TYPE="submit" value="Cancella" name="cancella"></TD></TR>
		</TABLE>
		
	</FORM>
e questo è tutto ok

questo è il secondo
PHP:
<FORM METHOD=POST ACTION="invianomi.php" name="invia">
<TABLE border="3" width="200" >
	<TR align="center"><TD COLSPAN="2"><B>Inserimento nomi</B></TD></TR>
		<?php
		$elemento=$_POST['elementi'];
		for ($i=1;$i<=($elemento);$i++)
		{
			echo"<TR><TD>Nome$i</TD><TD><INPUT TYPE=\"text\" NAME=\"nome".$i."\"></TD></TR>";	
		}
		
		?>
		<TR><TD ALIGN="CENTER" COLSPAN="2"><INPUT TYPE="submit" value="invia" name="invia"><INPUT TYPE="submit" value="cancella" name="cancella"></TD></TR>
</TABLE>
</FORM>
e anke qui credo sia tutto ok
e questo è il terzo
PHP:
<?php
			$element=$_POST['$elementi'];
			$nome=$_POST['nome1'];
			$nomi= array ("$nome");
			for ($i=1;$i<=($element);$i++)
			{
				$nome=$_POST["nome$i"];
				$nomi[]="$nome";
			}
			$scrivi_file=fopen("nomi.txt","w");
			for ($i=0;$i<count($nomi);$i++)
			{
				fwrite($scrivi_file,$nomi[$i]);
				$l= array (strlen($nomi[$i]));
			}
			fclose($scrivi_file);
			sort($l);
			
			for ($i=0;$i<count($l);$i++)
				print("$l");
?>
in questo script invece ho fatto un pò di confusione e non capiscocome riuscire a risolvere il problema come ad esempio il passaggio della variabile elementi dal secondo form l'ordinamento dell'array, vi ringrazio anticipatamente.
 
questo è il secondo
PHP:
<FORM METHOD=POST ACTION="invianomi.php" name="invia">
<TABLE border="3" width="200" >
	<TR align="center"><TD COLSPAN="2"><B>Inserimento nomi</B></TD></TR>
		<?php
		$elemento=$_POST['elementi'];
		for ($i=1;$i<=($elemento);$i++)
		{
			echo"<TR><TD>Nome$i</TD><TD><INPUT TYPE=\"text\" NAME=\"nome".$i."\"></TD></TR>";	
		}
		
		?>
		<TR><TD ALIGN="CENTER" COLSPAN="2"><INPUT TYPE="submit" value="invia" name="invia"><INPUT TYPE="submit" value="cancella" name="cancella"></TD></TR>
</TABLE>
</FORM>
e anke qui credo sia tutto ok
e questo è il terzo
PHP:
<?php
			$element=$_POST['$elementi'];
			$nome=$_POST['nome1'];
			$nomi= array ("$nome");
			for ($i=1;$i<=($element);$i++)
			{
				$nome=$_POST["nome$i"];
				$nomi[]="$nome";
			}
			$scrivi_file=fopen("nomi.txt","w");
			for ($i=0;$i<count($nomi);$i++)
			{
				fwrite($scrivi_file,$nomi[$i]);
				$l= array (strlen($nomi[$i]));
			}
			fclose($scrivi_file);
			sort($l);
			
			for ($i=0;$i<count($l);$i++)
				print("$l");
?>
in questo script invece ho fatto un pò di confusione e non capiscocome riuscire a risolvere il problema come ad esempio il passaggio della variabile elementi dal secondo form l'ordinamento dell'array, vi ringrazio anticipatamente.

Personalmente per quanto riguarda il secondo farei
PHP:
<FORM METHOD=POST ACTION="invianomi.php" name="invia">
<TABLE border="3" width="200" >
    <TR align="center"><TD COLSPAN="2"><B>Inserimento nomi</B></TD></TR>
        <?php        
        for ($i=0;$i<$_POST['elementi'];$i++)
        {
            echo"<TR><TD>Nome$i</TD><TD><INPUT TYPE=\"text\" NAME=\"nome[]"\"></TD></TR>";    
        }
        
        ?>
        <TR><TD ALIGN="CENTER" COLSPAN="2"><INPUT TYPE="submit" value="invia" name="invia"><INPUT TYPE="submit" value="cancella" name="cancella"></TD></TR>
</TABLE>
</FORM>

per il terzo hai
PHP:
<?php
            $nomi = $_POST['nome'];
            $l=array();
            $scrivi_file=fopen("nomi.txt","w");
            foreach ($nomi as $nome)
            {
                fwrite($scrivi_file,$nome);
                $l[]= strlen($nome);
            }
            fclose($scrivi_file);
            sort($l);
            
            print_r($l);
?>

Per finire ... ho corretto solo quanto più evidente sull'uso degli array e non ho testato gli script. In sostanza nel secondo faccio in modo che i nomi siano memotizzati in un array nella variabile $_POST['nome']. Un errore stava nel fatto che la variabile $l veniva reinizializzata ad ogni iterazione con un nuovo array contenente un solo elemento e non credo fosse quello che volevi. Comunque quello che visualizzi da $l è un array di numeri contenente le lunghezze delle stringhe, invece l'esercizio ti chiede di visualizzare il testo dal più lugngo al più corto.

:byebye:
 
e si infatti nn sò come fare per ordinare le stringhe in base alla loro lunghezza, e poi per ciò ke mi hai suggerito mi dice variabile non definita nella prima istruzione e argomenti nn validi nel foreach
Mi suggerisci qlk altra soluzione?
 
Una soluzione all'esercizio potrebbe essere questa
Index.php
PHP:
<?php
//L'array delle pietanze viene memorizzato nella variabile di sessione che
//funge da banca dati
session_start();

if(!isset($_SESSION['pietanze']))
  $_SESSION['pietanze']=array();


//Eleborazione dell'interazione dell'utente
if(isset($_POST['operazione'])){
  switch ($_POST['operazione']) {
      //Gestione dell'aggiunta di una nuova pietanza all'elenco
      case 'Aggiungi':
        $_POST['pietanza']=strtolower(trim($_POST['pietanza']));
        if(!empty($_POST['pietanza']))
          $_SESSION['pietanze'][]=$_POST['pietanza'];
        break;
      //Gestione delle pietanze selezionate dall'elenco pietanze
      case 'Seleziona':
        $testofile="";  //Testo per il file
        $temp=array();  //Array ordinato secondo la lunghezza delle stringhe
        if(isset($_POST['pietanza']))
          //Scorro l'elenco delle pietanze selezionate
          foreach($_POST['pietanza'] as $pietanza){
            $testofile.="$pietanza\n";
            
            //Per ogni pietanza effettuo un insert sort in $temp[]
            for($i=0, $n=count($temp);$i<$n;$i++){
              if(strlen($pietanza)>strlen($temp[$i])){
                $t=$pietanza;
                $pietanza=$temp[$i];
                $temp[$i]=$t;
              }
            }
            $temp[]=$pietanza;
          }
        //Scrittura del file di testo
        file_put_contents("pietanze.txt", $testofile);
        break;
  }
}

?>


<!-- Visualizzazione interfaccia utente -->
<html>
  <head>
    <title>Esercizio 27</title>
  </head>
  <body>
    <!-- Modulo di aggiunta di una pietanza -->
    <form action="index.php" method="post" enctype="application/x-www-form-urlencoded">
      <fieldset>
        <legend>Aggiungi una pietanza</legend>
        <label for="pietanza">Nome Pietanza</label>
        <input type="text" id="pietanza" name="pietanza" />
        <input type="submit" name="operazione" value="Aggiungi" />
      </fieldset>
    </form>
    <!-- Modulo di selezione pietanze fra quelle aggiunte -->
    <form action="index.php" method="post" enctype="application/x-www-form-urlencoded">
      <fieldset>
        <legend>Seleziona i tuoi piatti preferiti</legend>
        <?php
          foreach($_SESSION['pietanze'] as $pietanza){
            $pietanza=htmlspecialchars($pietanza);
            $ID=uniqid();
            echo <<<END
            <input id="$ID" type="checkbox" name="pietanza[]" value="$pietanza" />
            <label for="$ID">$pietanza</label><br />
END;
          }
        ?>
        <input type="submit" name="operazione" value="Seleziona" />
      </fieldset>
    </form>
    <!-- Visualizzazione dell'array delle pietanze ordinato per la lunghezza del testo -->
    <pre>
    <?php
        if(isset($temp)) print_r($temp);
      ?>
    </pre>
  </body>
</html>

In alternativa all'insert sort puoi costruire nel ciclo un array avente per chiave il nome della pietanza e per valore la lunghezza della chiave. Quindi puoi utilizzare la funzione asort o arsort per ordina l'array preservando l'associazione con le chiavi. Quindi visualizzi il valore delle chiavi.
 
Ultima modifica:
proprio non capisco come posso fare per inserire i nomi in un array salvarli in un file di testo e visualizzarli a video in base alla loro lunghezza sia nell'esercizio 27 che nell'es 28
Vi ringrazio se mi suggerite qlk
 

Discussioni simili