Comment obtenir un tableau d'entrée de formulaire dans un tableau PHP

92

J'ai un formulaire comme celui ci-dessous qui est publié sur contacts.php, et l'utilisateur peut en ajouter de manière dynamique avec 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[]" />

Si je les fais écho en php avec le code ci-dessous

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

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

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

J'obtiendrai quelque chose comme ceci:

nom1nom2nom3email1email2email3

comment puis-je obtenir ces tableaux dans quelque chose comme le code ci-dessous

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

donc ma sortie est comme ceci:

Le nom est name1 et l'email est email1 , merci
Le nom est name2 et l'email est email2 , merci
Le nom est name3 et l'email est email3 , merci

merci pour toute aide ou conseil

thom
la source

Réponses:

146

Ils sont déjà dans des tableaux: $nameest un tableau, tel quel$email

Donc, tout ce que vous avez à faire est d'ajouter un peu de traitement pour attaquer les deux tableaux:

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

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

Pour gérer plus d'entrées, étendez simplement le modèle:

$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
la source
merci, et si j'ajoutais une autre entrée comme location [], comment pourrais-je ajouter cela également?
thom le
1
Fondamentalement, vous étendez simplement le modèle. Voir ma modification ci-dessus ... toutes les entrées supplémentaires seront également des tableaux lorsque vous les affectez à partir de $ _POST (en supposant qu'il y ait plusieurs entrées avec ce nom dans le html, comme vous l'avez fait avec ces champs).
Jeffrey Blake
1
Jeffrey, je me demande si je peux me fier à l'ordre des tableaux. Autrement dit, sommes-nous sûrs que cela $emails[1]correspond à l'utilisateur nommé $name[1]? Je pense que j'ai rencontré des problèmes avec cela dans le passé, mais je me trompe peut-être. Merci
idrarig
1
@bruciasse - La façon dont le serveur gère les tableaux d'entrée comme celui-ci variera d'un serveur Web à l'autre (différents systèmes d'exploitation implémentent les choses différemment lorsqu'il s'agit de détails fins comme celui-ci), mais chaque plate-forme sur laquelle j'ai utilisé ces techniques est cohérente dans lui-même (c'est-à-dire que l'ordre est le même à chaque fois). Il est possible qu'un navigateur puisse mélanger l'ordre des variables de demande avant de transmettre la demande au serveur, mais je m'attendrais à ce que ce soit assez inhabituel. Le dernier problème auquel vous pourriez être confronté est celui du mélange html dans un ordre étrange et de l'ajustement CSS
Jeffrey Blake
... le positionnement. Si votre page était comme ça, il y aurait certainement des problèmes étranges avec l'ordre r / t des tableaux.
Jeffrey Blake
51

Par exemple, en nommant les champs comme

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

(ce qui est également possible lors de l'ajout d'éléments via javascript)

Le script php correspondant pourrait ressembler à

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
la source
4

Je sais que c'est un peu tard maintenant, mais vous pouvez faire quelque chose comme ceci:

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

Le test avec:

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

Ceci pour moi a produit:

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
la source
2

Et si vous disposez d'un tableau de jeux de champs?

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

J'ai ajouté un champ caché pour compter le nombre de jeux de champs. L'utilisateur peut ajouter ou supprimer les champs, puis les enregistrer.

Sophia Gavish
la source
2

J'ai également rencontré ce problème. Étant donné 3 entrées: champ [], champ2 [], champ3 []

Vous pouvez accéder dynamiquement à chacun de ces champs. Étant donné que chaque champ sera un tableau, les champs associés partageront tous la même clé de tableau. Par exemple, données d'entrée données:

Bob et son email et son sexe partageront la même clé. Dans cet esprit, vous pouvez accéder aux données dans une boucle for comme ceci:

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

Cela évolue également. Tout ce que vous avez à faire est d'ajouter vos variables de tableau respectives chaque fois que vous avez besoin d'ajouter de nouveaux champs.

thatonefreeman
la source
0

Cependant, la solution de VolkerK est la meilleure pour éviter de manquer le couple entre l'email et le nom d'utilisateur. Vous devez donc générer du code HTML avec PHP comme ceci:

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

Modifiez $ total_data en fonction de vos besoins. Pour le montrer, comme ceci:

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

En supposant que les données ont été envoyées à l'aide de la méthode POST.

iroel
la source
0

Néanmoins, vous pouvez utiliser le code ci-dessous comme,

$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
la source
0

C'est simple:

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

L'utilisation de cette méthode devrait fonctionner:

$name = $_POST['name'];
$email = $_POST['account'];
while($explore=each($email)) {
    echo $explore['key'];
    echo "-";
    echo $explore['value'];
    echo "<br/>";
}
Raphael Gates
la source
Expliquez votre réponse étape par étape
krisdestruction