Przesyłanie wielowymiarowej tablicy przez POST z php

103

Mam formularz php, który ma znaną liczbę kolumn (np. Górną średnicę, dolną średnicę, materiał, kolor, ilość), ale ma nieznaną liczbę wierszy, ponieważ użytkownicy mogą dodawać wiersze według potrzeb.

Odkryłem, jak wziąć każde z pól (kolumn) i umieścić je w własnej tablicy.

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

Więc to, co otrzymuję w HTML, to:

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

To, co chciałbym teraz zrobić, to zebrać wszystkie wiersze i kolumny, umieścić je w wielowymiarowej tablicy i wysłać zawartość e-mailem do klienta (najlepiej w ładnie sformatowanej tabeli). Nie byłem w stanie naprawdę pojąć, jak połączyć wszystkie te dane wejściowe i wybrać w ładną tablicę.

W tym momencie będę musiał spróbować użyć kilku tablic 1D, chociaż mam pomysł, że użycie jednej tablicy 2D byłoby lepszą praktyką niż użycie kilku tablic 1D.

Firelight
źródło

Odpowiedzi:

149

Po przesłaniu otrzymasz tablicę tak, jakby została utworzona w ten sposób:

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

Jednak sugerowałbym zamiast tego zmianę nazw formularzy na ten format:

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

Używając tego formatu, znacznie łatwiej jest przeglądać wartości.

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>';
}
Niezadowolony Kozioł
źródło
Dzięki! Zacząłem się do tego zbliżać, chociaż odwróciłem kolumny i wiersze.
Fireflight,
Co powiesz na to, że klonujesz pola tekstowe i nie masz kontroli nad dodawaniem nazw do listy, na przykład name="diameters[0][top]co mogę zrobić, jeśli mam więcej niż jedną nazwę? takie jak góra, dół, lewa i prawa? @DisgruntledGoat
JMASTER B
@JMASTERB Późne dodawanie, ale musiałbyś dodać trochę przetwarzania za pomocą JS, tj. Jeśli są w porządku, po klonowaniu odczytujesz poprzednią nazwę wejścia i ręcznie zwiększasz o 1 dla każdego atrybutu nazwy wejścia w klonie.
Daniel
16

możesz podać wszystkie parametry z taką nazwą:

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

później robisz coś takiego:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
Laimoncijus
źródło
0

Zrobiłem funkcję, która obsługuje tablice, a także pojedyncze wartości GET lub POST

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;

}

Przykłady:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Szél Lajos
źródło