Come ottenere un array di input del modulo in un array PHP


92

Ho un modulo come quello qui sotto che è pubblicato su contacts.php e l'utente può aggiungerne altri dinamicamente con jquery.

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

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

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

Se li echo in php con il codice qui sotto

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $v ) {
print $v;
}

foreach( $email as $v ) {
print $v;
}

Otterrò qualcosa del genere:

nome1nome2nome3email1email2email3

come posso inserire quegli array in qualcosa di simile al codice qui sotto

function show_Names($n, $m)
{
return("The name is $n and email is $m, thank you");
}

$a = array("name1", "name2", "name3");
$b = array("email1", "email2", "email3");

$c = array_map("show_Names", $a, $b);
print_r($c);

quindi il mio output è come questo:

Il nome è nome1 e l'email è email1 , grazie
Il nome è nome2 e l'email è email2 , grazie
Il nome è nome3 e l'email è email3 , grazie

grazie per qualsiasi aiuto o consiglio

Risposte:


146

Sono già in array: $nameè un array, così com'è$email

Quindi tutto ciò che devi fare è aggiungere un po 'di elaborazione per attaccare entrambi gli array:

$name = $_POST['name'];
$email = $_POST['account'];

foreach( $name as $key => $n ) {
  print "The name is ".$n." and email is ".$email[$key].", thank you\n";
}

Per gestire più input, estendi semplicemente il pattern:

$name = $_POST['name'];
$email = $_POST['account'];
$location = $_POST['location'];

foreach( $name as $key => $n ) {
  print "The name is ".$n.", email is ".$email[$key].
        ", and location is ".$location[$key].". Thank you\n";
}

grazie, e se aggiungessi un altro input come location [], come potrei aggiungerlo anche io?
Thom

1
Fondamentalmente, estendi semplicemente il modello. Vedi la mia modifica sopra ... anche eventuali input aggiuntivi saranno array quando li assegni da $ _POST (supponendo che ci siano più input con quel nome nell'html, come hai fatto con questi campi).
Jeffrey Blake

1
Jeffrey, mi chiedo se posso fidarmi dell'ordinamento degli array. Cioè, siamo sicuri che $emails[1]corrisponda all'utente nominato $name[1]? Penso di aver avuto problemi con questo in passato, ma potrei sbagliarmi. Grazie
idrarig

1
@bruciasse - Il modo in cui il server gestisce gli array di input come questo varia da un server web all'altro (diversi sistemi operativi implementano le cose in modo diverso quando si tratta di dettagli a grana fine come questo), tuttavia ogni piattaforma su cui ho utilizzato queste tecniche è coerente all'interno stesso (cioè l'ordine è lo stesso ogni volta). È possibile che un browser possa confondere l'ordine delle variabili di richiesta prima di passare la richiesta al server, ma mi aspetto che sia abbastanza insolito. L'ultimo problema che potresti affrontare è quello dell'html mescolato in uno strano ordine e l'adattamento CSS
Jeffrey Blake

... il posizionamento. Se la tua pagina fosse così, vedrebbe sicuramente alcuni strani problemi con l'ordinamento r / t degli array.
Jeffrey Blake

51

Ad esempio, nominando i campi come

<input type="text" name="item[0][name]" />
<input type="text" name="item[0][email]" />

<input type="text" name="item[1][name]" />
<input type="text" name="item[1][email]" />

<input type="text" name="item[2][name]" />
<input type="text" name="item[2][email]" />

(cosa possibile anche quando si aggiungono elementi tramite javascript)

Lo script php corrispondente potrebbe essere simile a

function show_Names($e)
{
  return "The name is $e[name] and email is $e[email], thank you";
}

$c = array_map("show_Names", $_POST['item']);
print_r($c);

4

So che è un po 'tardi adesso, ma potresti fare qualcosa del genere:

function AddToArray ($post_information) {
    //Create the return array
    $return = array();
    //Iterate through the array passed
    foreach ($post_information as $key => $value) {
        //Append the key and value to the array, e.g.
            //$_POST['keys'] = "values" would be in the array as "keys"=>"values"
        $return[$key] = $value;
    }
    //Return the created array
    return $return;
}

Il test con:

if (isset($_POST['submit'])) {
    var_dump(AddToArray($_POST));
}

Questo per me ha prodotto:

array (size=1)
  0 => 
    array (size=5)
      'stake' => string '0' (length=1)
      'odds' => string '' (length=0)
      'ew' => string 'false' (length=5)
      'ew_deduction' => string '' (length=0)
      'submit' => string 'Open' (length=4)

2

Cosa succede se hai un array di fieldset?

<fieldset>
<input type="text" name="item[1]" />
<input type="text" name="item[2]" />
<input type="hidden" name="fset[]"/>
</fieldset>

<fieldset>
<input type="text" name="item[3]" />
<input type="text" name="item[4]" />
<input type="hidden" name="fset[]"/>
</fieldset>

Ho aggiunto un campo nascosto per contare il numero dei fieldset. L'utente può aggiungere o eliminare i campi e quindi salvarli.


2

Mi sono imbattuto anche in questo problema. Dati 3 input: campo [], campo2 [], campo3 []

È possibile accedere a ciascuno di questi campi in modo dinamico. Poiché ogni campo sarà un array, i campi correlati condivideranno tutti la stessa chiave dell'array. Ad esempio, dati di input forniti:

  • Bob, bob@bob.com, maschio
  • Mark, mark@mark.com, maschio

Bob, la sua email e il sesso condivideranno la stessa chiave. Con questo in mente, puoi accedere ai dati in un ciclo for come questo:

    for($x = 0; $x < count($first_name); $x++ )
    {
        echo $first_name[$x];
        echo $email[$x];
        echo $sex[$x];
        echo "<br/>";
    }

Anche questo è in scala. Tutto quello che devi fare è aggiungere i tuoi rispettivi array vars ogni volta che hai bisogno di aggiungere nuovi campi.


0

Tuttavia, la soluzione di VolkerK è la migliore per evitare di perdere la coppia tra e-mail e nome utente. Quindi devi generare codice HTML con PHP in questo modo:

<? foreach ($i = 0; $i < $total_data; $i++) : ?>
    <input type="text" name="name[<?= $i ?>]" />
    <input type="text" name="email[<?= $i ?>]" />
<? endforeach; ?>

Modifica $ total_data in base alle tue esigenze. Per mostrarlo, proprio in questo modo:

$output = array_map(create_function('$name, $email', 'return "The name is $name and email is $email, thank you.";'), $_POST['name'], $_POST['email']);
echo implode('<br>', $output);

Supponendo che i dati siano stati inviati utilizzando il metodo POST.


0

Tuttavia, puoi utilizzare il codice seguente come,

$a = array('name1','name2','name3');
$b = array('email1','email2','email3');

function f($a,$b){
    return "The name is $a and email is $b, thank you";
}

$c = array_map('f', $a, $b);

//echoing the result

foreach ($c as $val) {
    echo $val.'<br>';
}

0

Questo è facile:

foreach( $_POST['field'] as $num => $val ) {
      print ' '.$num.' -> '.$val.' ';
    }

-4

L'utilizzo di questo metodo dovrebbe funzionare:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}

Spiega la tua risposta passo dopo passo
krisdestruction
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.