Enviando uma matriz multidimensional via POST com php

103

Eu tenho um formulário php que tem um número conhecido de colunas (ex. Diâmetro superior, diâmetro inferior, tecido, cor, quantidade), mas possui um número desconhecido de linhas, pois os usuários podem adicionar linhas conforme necessário.

Eu descobri como pegar cada um dos campos (colunas) e colocá-los em um array próprio.

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

Então, o que acabo com o 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.

O que eu gostaria de fazer agora é colocar todas as linhas e colunas em uma matriz multidimensional e enviar por e-mail o conteúdo para o cliente (de preferência em uma tabela bem formatada). Eu não fui capaz de compreender realmente como combinar todas essas entradas e seleções em um bom array.

Neste ponto, terei que tentar usar vários arrays 1D, embora tenha a ideia de que usar um único array 2D seria uma prática melhor do que usar vários arrays 1D.

Fireflight
fonte

Respostas:

149

Ao enviar, você obteria uma matriz como se fosse criada assim:

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

No entanto, sugiro alterar os nomes dos formulários para este formato:

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

Usando esse formato, é muito mais fácil percorrer os valores.

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>';
}
DisgruntledGoat
fonte
Obrigado! Eu comecei a chegar perto disso, embora tivesse a coluna e as linhas invertidas.
Fireflight
E se você estiver clonando campos de texto e não tiver controle sobre a adição de nomes à lista, por exemplo, o name="diameters[0][top]que posso fazer se tiver mais de um nome? como superior, inferior, esquerdo e direito? @DisgruntledGoat
JMASTER B
@JMASTERB Adição tardia, mas você teria que adicionar algum processamento com JS, ou seja, se eles estivessem em ordem, você leria o nome da entrada anterior após a clonagem e aumentaria em 1 manualmente para cada atributo de nome de entrada no clone.
Daniel
16

você pode enviar todos os parâmetros com essa nomenclatura:

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

então, mais tarde, você faz algo assim:

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

Eu fiz uma função que lida com matrizes, bem como valores GET ou POST únicos

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;

}

Exemplos:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Szél Lajos
fonte