Подання багатовимірного масиву через 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.

Що я хотів би зробити зараз, це взяти всі рядки та стовпці, помістити їх у багатовимірний масив та надіслати його вмісту клієнтові (бажано в добре відформатованій таблиці). Я так і не зміг зрозуміти, як поєднати всі ці входи та вибір у хороший масив.

На даний момент мені доведеться спробувати використовувати декілька 1D масивів, хоча я маю думку, що використання одного 2D масиву було б кращою практикою, ніж використання декількох 1D масивів.

Відповіді:


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

Дякую! Я почав наближатися до цього, хоча в мене були перевернуті стовпці та рядки.
Повітряний політ

Як щодо того, якщо ви клонуєте текстові поля та не маєте контролю над додаванням імен до списку, наприклад, name="diameters[0][top]що я можу зробити, якщо у мене є більше одного імені? наприклад верхній, нижній, лівий і правий? @DisgruntledGoat
JMASTER B

@JMASTERB Пізнє додавання, але вам доведеться додати деяку обробку за допомогою JS, тобто, якщо вони в порядку, ви прочитали б попереднє ім'я введення після клонування, а збільшувались на 1 вручну для кожного атрибута вхідного імені в клоні.
Даніель

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","");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.