Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di leonix
    Registrato dal
    Jul 2005
    Messaggi
    18

    manipolare numero indefinito di variabili $_POST['var_x']

    Salve a tutti,
    mi interesserebbe sapere, visto che reputo il mio modo di programmare alquanto sporco e macchinoso, come fareste voi per risolvere il seguente problema:

    Una pagina php riceve per post, o per get indifferentemente, un numero imprecisato di valori che hanno tutti il nome contenente lo stesso prefisso, e seguito da un numero, per esempio
    var_1, var_2, var_3,... ecc
    e io voglio memorizzarli in un array
    lista[0], lista[1], lista[2],... ecc
    di questi valori è possibile che non ne venga passato nessuno, così come è possibile che ne vengano passati diversi.
    Come fareste per manipolare questi dati?


    grazie,
    il mio codice è il seguente
    codice:
    $lista = Array();       // array contenente gli ipotetici valori passati
    $lista_counter=0;     // contatore del numero di elementi dell'array
    
    if(isset($_POST['var_1'])){          // se è definita la prima variabile...
    	$lista_counter++;
    	while(isset($_POST['var_'.$lista_counter])){            // la memorizza e prova con la seconda
    		$lista[$lista_counter-1]=$_POST['var_'.$lista_counter];
    		$lista_counter++;
    	}
    }
    $lista_counter--;       // quando l'ultima variabile viene memorizzata il contatore è sfasato di 1 e viene decrementato per risultare il computo esatto di cicli while

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    1,453
    Io lo ottimizzerei cosi in poche righe
    Codice PHP:
    $lista = array();

    //Cerco i valori nell'array globale post
    foreach($_POST as $var => $value){ 
         
    //Controllo che ci sia var
         //  if(strpos($var,'var_')!==false) ti consiglio il secondo controllo che identifica se var_ è iniziale
             
    if(substr($var,0,4)=='var_')
         
    //aggiungo il valore alla lista che sarà automaticamente in ordine numerico
                  
    $lista[] = $value;
       }

    echo 
    $lista[1]; //output: var_2 

  3. #3
    Se invece vuoi far partire $lista da 1, ma non ne vedo il motivo:

    Codice PHP:
    $lista = array();

    //Cerco i valori nell'array globale post
    $n 1;
    foreach(
    $_POST as $var => $value){ 
         
    //Controllo che ci sia var
         //  if(strpos($var,'var_')!==false) ti consiglio il secondo controllo che identifica se var_ è iniziale
             
    if(substr($var,0,4)=='var_')
         
    //aggiungo il valore alla lista che sarà automaticamente in ordine numerico
                  
    $lista[$n] = $value;
                  
    $n++;
       }

    echo 
    $lista[1]; //output: var_1 
    Ciao!

  4. #4
    Utente di HTML.it L'avatar di leonix
    Registrato dal
    Jul 2005
    Messaggi
    18
    grazie delle risposte!
    sono due soluzioni validissime ma sto cercando di ottimizzare il processo, visto che oltre a var_1, var_2, var_3,... ecc, vi sono numerosi altri valori passati per POST, e mi sembra uno spreco di cicli cpu farli leggere tutti solo per estrapolare questi dati.
    Per esempio potrebbero coesistere numerose altre $_POST, come:
    titolo
    autore
    data
    tipo_documento
    ... lunga lista di valori...
    ... ecc ecc ecc.....
    e solo in qualche caso vengono prodotte queste altre: var_1, var_2, var_3...

    mi sembra quindi più idoneo mirare direttamente a questi nomi.

    ripensando il mio codice ho ottenuto:

    codice:
    $lista = Array();       // array contenente gli ipotetici valori passati
    $lista_counter=0;     // contatore del numero di elementi dell'array
    
    while(isset($_POST['var_'.($lista_counter+1)])){
    	$lista[$lista_counter]=$_POST['var_'.($lista_counter+1)];
    	$lista_counter++;
    }
    o addirittura potrebbe funzionare qualcosa del genere: se non sbaglio una corretta assegnazione di una qualsiasi variabile restituisce un valore true, in caso contrario invece il ciclo while si termina automaticamente...giusto?

    codice:
    $lista = Array();       // array contenente gli ipotetici valori passati
    $lista_counter=0;     // contatore del numero di elementi dell'array
    
    while($lista[$lista_counter]=$_POST['var_'.($lista_counter+1)]){
    	$lista_counter++;
    }

  5. #5
    Io costruirei il form differentemente tramite un array inviato in post.

    Codice PHP:
    ...

    <
    input type="text" name="var[]" />
    <
    input type="text" name="var[]"  />
    <
    input type="text" name="var[]" />
    <
    input type="text" name="var[]" />
    <
    input type="text" name="var[]" />

    ... 
    la pagina riceverà un unica variabile ce sarà un array
    Codice PHP:
    <?php
    $var 
    = (array) $_POST['var'];
    print_r$_POST['var'] );
    /*eventualmente puoi eliminare eventuali variabili vuote*/
    array_map('trim'$var );
    array_filter$var );
    /*etc etc*/
    ?>
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  6. #6
    Utente di HTML.it L'avatar di leonix
    Registrato dal
    Jul 2005
    Messaggi
    18
    molto interessante questa cosa mi é nuova!

    purtroppo però il form non é costruito da me, si tratta di una pagina esterna che non posso gestire...

    ho fatto una paginetta di prova e sembra funzionare, solo non capisco come mai nell'output di prova si genera una ultima chiave vuota dell'array lista[]!

    questo file é da nominare test.php
    codice:
    <?php
    if(isset($_POST['cmd'])){
    	$lista = Array();       // array contenente gli ipotetici valori passati
    	$lista_counter=0;     // contatore del numero di elementi dell'array
    
    	while($lista[$lista_counter]=$_POST['var_'.($lista_counter+1)]){
    		$lista_counter++;
    	}
    	
    	foreach($lista as $var => $value)
    		echo "$var = $value
    ";          // OUTPUT DI PROVA
    	exit(0);
    }
    ?>
    <form action='test.php' method='post'>
    <input type='hidden' name='cmd' value='do'>
    <script language='Javascript'>
    var n=Math.floor(Math.random()*11);
    
    for(var i=0; i<=n; i++){
    	document.write("<input type='hidden' name='var_"+i+"' value='"+i+"'>");
    }
    </script>
    <input type='submit'>
    </form>

  7. #7
    Non condivido l'apporccio... cmq prova così...
    Codice PHP:
    <?php
    //print_r($_POST);
    if(isset($_POST['cmd'])){
        
    $lista = Array();       // array contenente gli ipotetici valori passati
        
    $lista_counter=0;     // contatore del numero di elementi dell'array

        
    while(isset($_POST['var_'.($lista_counter+1)])){
            
    $lista[$lista_counter]= $_POST['var_'.($lista_counter+1)];
            
    $lista_counter++;
        }
        
        foreach(
    $lista as $var => $value)
            echo 
    "$var = $value
    "
    ;          // OUTPUT DI PROVA
        //exit(0);
    }
    ?>
    <form action='' method='post'>
    <input type='hidden' name='cmd' value='do'>
    <script language='Javascript'>
    var n=Math.floor(Math.random()*11);

    for(var i=0; i<=n; i++){
        document.write("<input type='hidden' name='var_"+i+"' value='"+i+"'>");
    }
    </script>
    <input name="cmd" type='submit'>
    </form>
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  8. #8
    Utente di HTML.it L'avatar di leonix
    Registrato dal
    Jul 2005
    Messaggi
    18
    così funziona perfettamente! grazie, gentilissimo!
    (molto utile l'action="" del form)

    viene effettuata una misera chiamata a isset() in più, niente di che preoccuparsi a livello di cpu, ma mi piacerebbe comunque sapere come mai si ottengono risultati diversi...
    sai darmi una spiegazione?

  9. #9
    Utente di HTML.it L'avatar di leonix
    Registrato dal
    Jul 2005
    Messaggi
    18
    come mai non condividi l'approccio?

  10. #10
    semplicemente perchè per cose di questo genere esistono gli array
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.