Отправка многомерного массива через POST с php - PullRequest
94 голосов
/ 12 марта 2010

У меня есть форма 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.

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

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

Ответы [ 3 ]

139 голосов
/ 12 марта 2010

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

$_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>';
}
16 голосов
/ 12 марта 2010

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

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

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

foreach ($_REQUEST['params'] as $item) {
    echo $item['topdiameter'];
    echo $item['bottomdiameter'];
}
0 голосов
/ 06 ноября 2018

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