Soumettre un tableau multidimensionnel via POST avec PHP


103

J'ai un formulaire php qui a un nombre connu de colonnes (ex. Diamètre supérieur, diamètre inférieur, tissu, couleur, quantité), mais a un nombre inconnu de lignes, car les utilisateurs peuvent ajouter des lignes selon leurs besoins.

J'ai découvert comment prendre chacun des champs (colonnes) et les placer dans un tableau qui leur est propre.

<input name="topdiameter['+current+']" type="text" id="topdiameter'+current+'" size="5" />
<input name="bottomdiameter['+current+']" type="text" id="bottomdiameter'+current+'" size="5" />

Donc, ce que je finis avec le HTML, c'est:

<tr>
  <td><input name="topdiameter[0]" type="text" id="topdiameter0" size="5" /></td>
  <td><input name="bottomdiameter[0]" type="text" id="bottomdiameter0" size="5" /></td>
</tr>
<tr>
  <td><input name="topdiameter[1]" type="text" id="topdiameter1" size="5" /></td>
  <td><input name="bottomdiameter[1]" type="text" id="bottomdiameter1" size="5" /></td>
</tr>

...and so on.

Ce que je voudrais faire maintenant, c'est prendre toutes les lignes et colonnes, les mettre dans un tableau multidimensionnel et envoyer le contenu de celui-ci au client (de préférence dans un tableau bien formaté). Je n'ai pas été en mesure de vraiment comprendre comment combiner toutes ces entrées et sélections dans un joli tableau.

À ce stade, je vais devoir essayer d'utiliser plusieurs tableaux 1D, même si j'ai l'idée que l'utilisation d'un seul tableau 2D serait une meilleure pratique que d'utiliser plusieurs tableaux 1D.

Réponses:


149

Lors de la soumission, vous obtiendrez un tableau comme s'il avait été créé comme ceci:

$_POST['topdiameter'] = array( 'first value', 'second value' );
$_POST['bottomdiameter'] = array( 'first value', 'second value' );

Cependant, je suggérerais de changer les noms de vos formulaires à ce format à la place:

name="diameters[0][top]"
name="diameters[0][bottom]"
name="diameters[1][top]"
name="diameters[1][bottom]"
...

En utilisant ce format, il est beaucoup plus facile de parcourir les valeurs.

if ( isset( $_POST['diameters'] ) )
{
    echo '<table>';
    foreach ( $_POST['diameters'] as $diam )
    {
        // here you have access to $diam['top'] and $diam['bottom']
        echo '<tr>';
        echo '  <td>', $diam['top'], '</td>';
        echo '  <td>', $diam['bottom'], '</td>';
        echo '</tr>';
    }
    echo '</table>';
}

Merci! J'avais commencé à m'en approcher, même si j'avais inversé la colonne et les lignes.
Fireflight

Que diriez-vous si vous clonez des champs de texte et n'avez aucun contrôle sur l'ajout de noms pour la liste, par exemple, name="diameters[0][top]que puis-je faire si j'ai plus d'un nom? comme le haut, le bas, la gauche et la droite? @DisgruntledGoat
JMASTER B

@JMASTERB Ajout tardif mais vous devrez ajouter des traitements avec JS, c'est-à-dire que s'ils sont dans l'ordre, vous liriez le nom d'entrée précédent après le clonage, et incrémenteriez de 1 manuellement pour chaque attribut de nom d'entrée dans le clone.
Daniel

16

vous pouvez soumettre tous les paramètres avec une telle dénomination:

params[0][topdiameter]
params[0][bottomdiameter]
params[1][topdiameter]
params[1][bottomdiameter]

puis plus tard, vous faites quelque chose comme ceci:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}

0

J'ai créé une fonction qui gère les tableaux ainsi que les valeurs GET ou POST uniques

function subVal($varName, $default=NULL,$isArray=FALSE ){ // $isArray toggles between (multi)array or single mode

    $retVal = "";
    $retArray = array();

    if($isArray) {
        if(isset($_POST[$varName])) {
            foreach ( $_POST[$varName] as $var ) {  // multidimensional POST array elements
                $retArray[]=$var;
            }
        }
        $retVal=$retArray;
    }

    elseif (isset($_POST[$varName]) )  {  // simple POST array element
        $retVal = $_POST[$varName];
    }

    else {
        if (isset($_GET[$varName]) ) {
            $retVal = $_GET[$varName];    // simple GET array element
        }
        else {
            $retVal = $default;
        }
    }

    return $retVal;

}

Exemples:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.