2010-03-17 3 views
4

У меня есть форма, которая содержит 8 столбцов и переменное количество строк, которые мне нужно отправить по электронной почте клиенту в хорошо отформатированном электронном письме. Форма представляет необходимые поля в виде многомерного массива. Грубый пример ниже:Вывести многомерный массив php в таблицу html

<input name="order[0][topdiameter]" type="text" id="topdiameter0" value="1" size="5" /> 
<input name="order[0][bottomdiameter]" type="text" id="bottomdiameter0" value="1" size="5" /> 
<input name="order[0][slantheight]" type="text" id="slantheight0" value="1" size="5" /> 
<select name="order[0][fittertype]" id="fittertype0"> 
    <option value="harp">Harp</option> 
    <option value="euro">Euro</option> 
    <option value="bulbclip">Regular</option> 
</select> 
<input name="order[0][washerdrop]" type="text" id="washerdrop0" value="1" size="5" /> 
<select name="order[0][fabrictype]" id="fabrictype"> 
    <option value="linen">Linen</option> 
    <option value="pleated">Pleated</option> 
</select> 
<select name="order[0][colours]" id="colours0"> 
    <option value="beige">Beige</option> 
    <option value="white">White</option> 
    <option value="eggshell">Eggshell</option> 
    <option value="parchment">Parchment</option> 
</select> 
<input name="order[0][quantity]" type="text" id="quantity0" value="1" size="5" /> 

Эта форма отформатирована в виде таблицы, а строки могут быть добавлены к нему динамически. То, что мне не удалось сделать, - это получить правильно отформатированную таблицу из массива.

Это то, что я сейчас использую (схватил с сетки).

<?php 
if (isset($_POST["submit"])) { 
$arr= $_POST['order'] 
echo '<table>'; 
foreach($arr as $arrs) 
    { 
    echo '<tr>'; 
    foreach($arrs as $item) 
    { 
     echo "<td>$item</td>"; 
    } 
    echo '</tr>'; 
    } 

echo '</table>; 
}; 
?> 

Это прекрасно работает для одного ряда данных. Если я попытаюсь отправить 2 или более строк из формы, то один из столбцов исчезнет. Я бы хотел, чтобы таблица отформатировалась как:

| top | Bottom | Slant | Fitter | Washer | Fabric | Colours | Quantity | 
------------------------------------------------------------------------ 
|value| value | value | value | value | value | value | value | 

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

Кажется, что это должно быть что-то довольно прямолинейное, но я просто не могу найти пример, который работает так, как он мне нужен.

+0

Несколько вещей - сначала похоже, что у вас есть синтаксическая ошибка на ваших последних строках PHP - возможно, вы ищете 'echo ''; } 'Во-вторых, когда у вас несколько строк, какой столбец исчезает? Когда вы добавляете больше строк, вы меняете 'порядок [0]' на 'порядок [1]' в HTML? – thetaiko

+0

Каковы имена входов для второй, третьей, четвертой и т. Д. Строк? –

ответ

5

В вашем HTML, попробовать что-то вроде этого:

<table> 
<tr> 
    <th>Bottom</th> 
    <th>Slant</th> 
    <th>Fitter</th> 
</tr> 
<?php foreach ($_POST['order'] as $order): ?> 
    <tr> 
    <td><?php echo $order['bottomdiameter'] ?></td> 
    <td><?php echo $order['slantheight'] ?></td> 
    <td><?php echo $order['fittertype'] ?></td> 
    </tr> 
<?php endforeach; ?> 
</table> 

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

+1

Вау, я никогда не видел, чтобы кто-то использовал альтернативный синтаксис для циклов foreach. Ухоженная! –

+0

Спасибо! Решение St. John Johnson также работает, но ваш код мне легче читать и настраивать. – Fireflight

7

Как насчет этого?

$keys = array_keys($_POST['order'][0]); 
echo "<table><tr><th>".implode("</th><th>", $keys)."</th></tr>"; 
foreach ($_POST['order'] as $order) { 
    if (!is_array($order)) 
    continue; 
    echo "<tr><td>".implode("</td><td>", $order)."</td></tr>"; 
} 
echo "</table> 
+0

+1 для терпения - хотя это может привести к некорректному выводу, если какая-либо из строк имеет разные/дополнительные столбцы (или если ключи отсортированы по-разному). – mskfisher

+0

@mskfisher хорошо пункт. Вы можете заменить строку 6 циклом for, который выполняет итерацию массива $ keys и выводит соответственно. Это гарантировало бы, что результат был в правильном порядке и только ключи, которые мы ожидаем. –

+0

Если вы относительно уверены в количестве столбцов, вы также можете вызвать 'ksort()' в массиве, чтобы убедиться, что он в правильном порядке. http://www.php.net/manual/en/function.ksort.php – mskfisher

6

класс Таблица я написал некоторое время назад

<?php 
class Table { 
    protected $opentable = "\n<table cellspacing=\"0\" cellpadding=\"0\">\n"; 
    protected $closetable = "</table>\n"; 
    protected $openrow = "\t<tr>\n"; 
    protected $closerow = "\t</tr>\n"; 

    function __construct($data) { 
     $this->string = $this->opentable; 
     foreach ($data as $row) { 
      $this->string .= $this->buildrow($row); 
     } 
     $this->string .= $this->closetable; 
    } 

    function addfield($field, $style = "null") { 
     if ($style == "null") { 
      $html = "\t\t<td>" . $field . "</td>\n"; 
     } else { 
      $html = "\t\t<td class=\"" . $style . "\">" . $field . "</td>\n"; 
     } 
     return $html; 
    } 

    function buildrow($row) { 
     $html .= $this->openrow; 
     foreach ($row as $field) { 
      $html .= $this->addfield($field); 
     } 
     $html .= $this->closerow; 
     return $html; 
    } 

    function draw() { 
     echo $this->string; 
    } 
} 
?> 

Чтобы использовать так:

<body> 
<?php 
$multiDimArray = []; # Turn the form array into a matrix 
for ($i = 0; $i < count($_POST['order']); $i++) { 
     $multiDimArray[] = []; 
    foreach ($_POST['order'][$i] as $key=>$value) { 
     if ($i == 0) { 
      $multiDimArray[$i][] = $key; 
     } 
     $multiDimArray[$i][] = $value; 
    } 
} 

$table = new Table($multiDimArray); # Create and draw the table 
$table->draw(); 
?> 
</body> 
Смежные вопросы