Como obter o array de entrada do formulário no array PHP

92

Eu tenho um formulário como o abaixo que é postado em contacts.php, e o usuário pode adicionar dinamicamente mais com 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 eu ecoá-los em php com o código abaixo

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

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

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

Vou pegar algo assim:

name1name2name3email1email2email3

como posso colocar esses arrays em algo como o código abaixo

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);

então minha saída é assim:

O nome é nome1 e o email é email1 , obrigado
O nome é nome2 e o email é email2 , obrigado
O nome é nome3 e o email é email3 , obrigado

obrigado por qualquer ajuda ou conselho

thom
fonte

Respostas:

146

Eles já estão em matrizes: $nameé uma matriz, como está$email

Portanto, tudo o que você precisa fazer é adicionar um pouco de processamento para atacar os dois arrays:

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

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

Para lidar com mais entradas, basta estender o padrão:

$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";
}
Jeffrey Blake
fonte
obrigado, e se eu adicionasse outra entrada como localização [], como poderia adicionar também?
Thom
1
Basicamente, você apenas estende o padrão. Veja minha edição acima ... quaisquer entradas adicionais também serão arrays quando você atribuí-las a partir de $ _POST (assumindo que haja várias entradas com esse nome no html, como você fez com esses campos).
Jeffrey Blake
1
Jeffrey, me pergunto se posso confiar na ordem dos arrays. Ou seja, temos certeza de que $emails[1]corresponde ao usuário nomeado $name[1]? Acho que tive problemas com isso no passado, mas posso estar errado. Obrigado
idrarig
1
@bruciasse - A forma como o servidor lida com matrizes de entrada como esta varia de um servidor web para outro (diferentes sistemas operacionais implementam coisas de maneira diferente quando se trata de detalhes refinados como este), no entanto, cada plataforma em que empreguei essas técnicas é consistente. em si (ou seja, a ordem é sempre a mesma). É possível que um navegador confunda a ordem das variáveis ​​de solicitação antes de passar a solicitação ao servidor, mas eu esperaria que isso fosse bastante incomum. O último problema que você pode enfrentar é o html sendo mixado em uma ordem estranha e ajustado para CSS
Jeffrey Blake
... o posicionamento. Se sua página fosse assim, certamente veria alguns problemas estranhos sem ordem dos arrays.
Jeffrey Blake
51

Por exemplo, nomeando os campos como

<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]" />

(o que também é possível ao adicionar elementos via javascript)

O script php correspondente pode parecer

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);
VolkerK
fonte
4

Eu sei que é um pouco tarde agora, mas você poderia fazer algo como isto:

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;
}

O teste com:

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

Isso para mim produziu:

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)
Can O 'Spam
fonte
2

E se você tiver um array de conjuntos de campos?

<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>

Eu adicionei um campo oculto para contar o número de conjuntos de campos. O usuário pode adicionar ou excluir os campos e salvá-los.

Sophia Gavish
fonte
2

Também me deparei com esse problema. Dados 3 entradas: campo [], campo2 [], campo3 []

Você pode acessar cada um desses campos dinamicamente. Como cada campo será um array, todos os campos relacionados compartilharão a mesma chave de array. Por exemplo, dados de entrada dados:

Bob e seu e-mail e sexo compartilharão a mesma chave. Com isso em mente, você pode acessar os dados em um loop for assim:

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

Isso também muda. Tudo que você precisa fazer é adicionar seus respectivos vars de array sempre que precisar que novos campos sejam adicionados.

aquele homem livre
fonte
0

No entanto, a solução de VolkerK é a melhor para evitar falhas entre e-mail e nome de usuário. Portanto, você deve gerar código HTML com PHP como este:

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

Altere $ total_data para atender às suas necessidades. Para mostrar, assim:

$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);

Supondo que os dados foram enviados usando o método POST.

iroel
fonte
0

No entanto, você pode usar o código abaixo como,

$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>';
}
Abhishek Gurjar
fonte
0

Este é fácil:

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

Usar este método deve funcionar:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}
Raphael Gates
fonte
Explique sua resposta passo a passo
krisdestruction