Gửi mảng đa chiều qua POST với php


103

Tôi có một biểu mẫu php có một số cột đã biết (ví dụ: đường kính trên, đường kính dưới, vải, màu sắc, số lượng), nhưng có số lượng hàng không xác định, vì người dùng có thể thêm hàng khi họ cần.

Tôi đã khám phá ra cách lấy từng trường (cột) và đặt chúng vào một mảng của riêng chúng.

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

Vì vậy, những gì tôi kết thúc với HTML là:

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

Điều tôi muốn làm bây giờ là lấy tất cả các hàng và cột đặt chúng vào một mảng đa chiều và gửi nội dung của mảng đó cho khách hàng (tốt nhất là trong một bảng được định dạng đẹp). Tôi đã không thể thực sự hiểu cách kết hợp tất cả các đầu vào đó và lựa chọn thành một mảng đẹp.

Tại thời điểm này, tôi sẽ phải cố gắng sử dụng một số mảng 1D, mặc dù tôi có ý tưởng rằng sử dụng một mảng 2D đơn lẻ sẽ là một cách thực hành tốt hơn so với sử dụng một số mảng 1D.

Câu trả lời:


149

Khi gửi, bạn sẽ nhận được một mảng như thể được tạo như thế này:

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

Tuy nhiên, tôi khuyên bạn nên thay đổi tên biểu mẫu của bạn thành định dạng này:

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

Sử dụng định dạng đó, việc lặp lại các giá trị dễ dàng hơn nhiều.

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>';
}

Cảm ơn! Tôi đã bắt đầu tiến gần đến điều này, mặc dù tôi đã lật ngược cột và hàng.
Fireflight

Còn nếu bạn đang sao chép các trường văn bản và không có quyền kiểm soát trong việc thêm tên cho danh sách, chẳng hạn như name="diameters[0][top]tôi có thể làm gì nếu tôi có nhiều hơn một tên? chẳng hạn như trên, dưới, trái và phải? @ DisgruntledGoat
JMASTER B

@JMASTERB Bổ sung muộn nhưng bạn sẽ phải thêm một số xử lý với JS, tức là nếu chúng theo thứ tự, bạn sẽ đọc tên đầu vào trước đó sau khi sao chép và tăng 1 theo cách thủ công cho mỗi thuộc tính tên đầu vào trong bản sao.
Daniel

16

bạn có thể gửi tất cả các tham số với cách đặt tên như vậy:

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

sau đó bạn làm điều gì đó như sau:

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

0

Tôi đã tạo một hàm xử lý mảng cũng như các giá trị GET hoặc POST đơn lẻ

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;

}

Ví dụ:

$curr_topdiameter = subVal("topdiameter","",TRUE)[3];
$user_name = subVal("user_name","");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.