web-dev-qa-db-fra.com

Html / PHP - Form - Entrée sous forme de tableau

J'ai un formulaire comme celui-ci

<form>
<input type="text" class="form-control" placeholder="Titel" name="levels[level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]">

<input type="text" class="form-control" placeholder="Titel" name="levels[level]">
<input type="text" class="form-control" placeholder="Titel" name="levels[build_time]">

</form>

Ce que j'aimerais avoir comme sortie $ _POST est un tableau comme

Array ( 
  [1] => Array ( [level] => 1 [build_time] => 123 ) 
  [2] => Array ( [level] => 2 [build_time] => 456 )
)

Je sais que je pourrais faire quelque chose comme name = "levels [1] [build_time]", etc., mais comme ces éléments sont ajoutés de façon dynamique, il serait difficile d'ajouter un index. Est-ce qu'il y a un autre moyen?

EDIT:

Comme suggéré, j'ai changé ma forme. J'ai également inclus tout mon code HTML maintenant, car je pense qu'il me manque quelque chose ici. Mon HTML maintenant:

<div class="form-group">
  <label class="col-md-2">Name(z.B. 1)</label>
  <div class="col-md-10">
    <input type="text" class="form-control" placeholder="Titel" name="levels[][level]">
  </div>

  <label class="col-md-2">Bauzeit(In Sekunden)</label>
  <div class="col-md-10">
    <input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]">
  </div>
</div>

<div class="form-group">
  <label class="col-md-2">Name(z.B. 1)</label>
  <div class="col-md-10">
    <input type="text" class="form-control" placeholder="Titel" name="levels[][level]">
  </div>

  <label class="col-md-2">Bauzeit(In Sekunden)</label>
  <div class="col-md-10">
    <input type="text" class="form-control" placeholder="Titel" name="levels[][build_time]">
  </div>
</div>

Le résultat que je reçois maintenant est:

[levels] => Array ( 
  [0] => Array ( [level] => 1 ) 
  [1] => Array ( [build_time] => 234 ) 
  [2] => Array ( [level] => 2 ) 
  [3] => Array ( [build_time] => 456 ) 
)

Edit 2:

Comme suggéré dans votre modification, j'ai modifié mon formulaire et déplacé les crochets à la fin du nom. Le résultat que je reçois maintenant est:

[levels] => Array ( 
  [level] => Array ( 
    [0] => 1 
    [1] => 2 
  ) 
  [build_time] => Array ( 
    [0] => 234 
    [1] => 456 
  )
) 

Je suppose que cela fonctionnerait un peu, mais cela semble quand même compliqué. Pas de meilleur moyen?

54
Evo_x

Ajoutez simplement [] à ces noms comme

 <input type="text" class="form-control" placeholder="Titel" name="levels[level][]">
 <input type="text" class="form-control" placeholder="Titel" name="levels[build_time][]">

Prenez ce modèle et vous pourrez ensuite les ajouter, même en utilisant une boucle.

Vous pouvez ensuite les ajouter autant de fois que vous le souhaitez, sans avoir à fournir d’index. PHP les récupérera comme dans l'exemple de scénario attendu.

Éditer

Désolé, j'avais des accolades au mauvais endroit, ce qui ferait de chaque nouvelle valeur un nouvel élément de tableau. Utilisez le code mis à jour maintenant et cela vous donnera la structure de tableau suivante

levels > level (Array)
levels > build_time (Array)

Le même index sur les deux sous-tableaux vous donnera votre paire. Par exemple

echo $levels["level"][5];
echo $levels["build_time"][5];
75
Hanky Panky

Si vous pouvez indexer le tableau, vous pouvez le faire:

<form>
    <input type="text" class="form-control" placeholder="Titel" name="levels[0][level]">
    <input type="text" class="form-control" placeholder="Titel" name="levels[0][build_time]">

    <input type="text" class="form-control" placeholder="Titel" name="levels[1][level]">
    <input type="text" class="form-control" placeholder="Titel" name="levels[1][build_time]">

    <input type="text" class="form-control" placeholder="Titel" name="levels[2][level]">
    <input type="text" class="form-control" placeholder="Titel" name="levels[2][build_time]">
</form>

... pour y parvenir:

[levels] => Array ( 
  [0] => Array ( 
    [level] => 1 
    [build_time] => 2 
  ) 
  [1] => Array ( 
    [level] => 234 
   [build_time] => 456 
  )
  [2] => Array ( 
    [level] => 111
    [build_time] => 222 
  )
) 

Mais si vous supprimez une paire d'entrées (dynamiquement, je suppose) du milieu du formulaire, vous obtiendrez des trous dans votre tableau, à moins que vous ne mettiez à jour les noms des entrées ...

29

HTML: Utiliser les noms comme

<input name="levels[level][]">
<input name="levels[build_time][]">

PHP:

$array = filter_input_array(INPUT_POST);
$newArray = array();
foreach (array_keys($array) as $fieldKey) {
    foreach ($array[$fieldKey] as $key=>$value) {
        $newArray[$key][$fieldKey] = $value;
    }
}  

$ newArray conservera les données que vous voulez

Array ( 
  [0] => Array ( [level] => 1 [build_time] => 123 ) 
  [1] => Array ( [level] => 2 [build_time] => 456 )
)
15
user6542662

en plus: pour ceux qui ont une variable vide POST, n'utilisez pas ceci:

name="[levels][level][]"

utilisez plutôt ceci (comme c'est déjà le cas dans cet exemple):

name="levels[level][]"
7
mheg