PHP로 POST를 통해 다차원 배열 제출


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.

지금 제가하고 싶은 것은 모든 행과 열을 다차원 배열에 넣고 그 내용을 클라이언트에게 이메일로 보내는 것입니다 (가급적 형식이 좋은 테이블). 나는 모든 입력을 결합하고 멋진 배열로 선택하는 방법을 실제로 이해할 수 없었습니다.

이 시점에서 여러 1D 배열을 사용하는 것이 좋지만, 여러 1D 배열을 사용하는 것보다 단일 2D 배열을 사용하는 것이 더 나은 방법이라는 생각이 있습니다.

답변:


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","");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.