Отправка многомерного массива через POST с помощью php

103

У меня есть форма php, которая имеет известное количество столбцов (например, верхний диаметр, нижний диаметр, ткань, цвет, количество), но имеет неизвестное количество строк, поскольку пользователи могут добавлять строки по мере необходимости.

Я обнаружил, как взять каждое из полей (столбцов) и поместить их в отдельный массив.

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

Итак, что я получаю в HTML:

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

Теперь я хотел бы взять все строки и столбцы, поместить их в многомерный массив и отправить его содержимое клиенту (желательно в красиво отформатированной таблице). Я не смог действительно понять, как объединить все эти входы и выборки в хороший массив.

На этом этапе мне придется попробовать использовать несколько одномерных массивов, хотя я считаю, что использование одного двухмерного массива было бы лучше, чем использование нескольких одномерных массивов.

Огненный полет
источник

Ответы:

149

При отправке вы получите массив, как если бы он был создан следующим образом:

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

Однако я бы предложил вместо этого изменить имена ваших форм на этот формат:

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

Используя этот формат, намного проще перебирать значения.

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>';
}
НедовольныйКозел
источник
Спасибо! Я начал приближаться к этому, хотя столбец и строки у меня были перевернуты.
Fireflight,
Как насчет того, если вы клонируете текстовые поля и не можете контролировать добавление имен для списка, например, name="diameters[0][top]что я могу сделать, если у меня более одного имени? например, сверху, снизу, слева и справа? @DisgruntledGoat
JMASTER B
@JMASTERB Позднее добавление, но вам придется добавить некоторую обработку с помощью JS, т.е. если они в порядке, вы должны прочитать предыдущее имя входа после клонирования и вручную увеличить на 1 для каждого атрибута имени входа в клоне.
Daniel
16

вы можете передать все параметры с таким наименованием:

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

потом вы делаете что-то вроде этого:

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
Лаймонциюс
источник
0

Я сделал функцию, которая обрабатывает массивы, а также отдельные значения GET или 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;

}

Примеры:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Сел Лайош
источник