Как напечатать динамическую таблицу с 4 столбцами из массива PHP и добавить пустую <td>для завершения строки таблицы - PullRequest
0 голосов
/ 12 мая 2019

У меня есть следующий массив php, и я пытаюсь напечатать таблицу с 4 столбцами. Все в порядке, пока массив не имеет 4/8, 12 и т. Д. Ключи / значения, но когда массив имеет длину, которая не может быть разделена на 4, становится проблемой. Вот образец массива:

$newarray =array(
"make"=> "Ford" ,
"model"=> "S-MAX" ,
"model_year"=> "2009" ,
"made"=>  "2010-01-01" ,
"manufacturer"=>  "Ford Werke AG" ,
"manufacturer_address"=>  "Koeln-Niehl, Germany" ,
"body"=> "Sedan/Saloon" ,
"engine_power_kw"=> "142" ,
"engine_displacement_ccm"=> "2000" ,
"engine_full"=> "2.0L Duratorq-TDCi (143PS) - DW" 
);

и код, который печатает таблицу:

$rama_result.='<table class="table w100 customtable">';
$i=1;
foreach($newarray as $key=>$value){
$rama_result1.= '<th>'.$key.'</th>';
$rama_result2.= '<td>'.$value.'</td>';

if($i % 4 == 0){
    $rama_result.='</tr><tr>'.$rama_result1.'</tr><tr>'.$rama_result2.'</tr><tr>';
    $rama_result1 = '';$rama_result2 = '';
    }
$i++;
}
    $rama_result.='</tr></table>';

Не могли бы вы помочь и показать мне способ печати недостающих 2 в последнем ряду, чтобы код работал правильно. Спасибо за вашу помощь

Код выше печатает эту таблицу

<table class="table w100 customtable"><tbody>
<tr><th>make</th><th>model</th><th>model_year</th><th>made</th></tr>
<tr><td>Ford</td><td>S-MAX</td><td>2009</td><td>2010-01-01</td></tr><tr></tr>
<tr><th>manufacturer</th><th>manufacturer_address</th><th>body</th><th>engine_power_kw</th></tr>
<tr><td>Ford Werke AG</td><td>Koeln-Niehl, Germany</td><td>Sedan/Saloon</td>    <td>142</td></tr>
<tr></tr></tbody></table>

<table class="table w100 customtable"><tbody>
<tr><th>make</th><th>model</th><th>model_year</th><th>made</th></tr>
<tr><td>Ford</td><td>S-MAX</td><td>2009</td><td>2010-01-01</td></tr><tr></tr>
<tr><th>manufacturer</th><th>manufacturer_address</th><th>body</th><th>engine_power_kw</th></tr>
<tr><td>Ford Werke AG</td><td>Koeln-Niehl, Germany</td><td>Sedan/Saloon</td>    <td>142</td></tr>
<tr></tr></tbody></table>

Ответы [ 3 ]

2 голосов
/ 12 мая 2019

Вместо зацикливания каждого значения используйте array_chunk, чтобы разделить массив, а затем сжать заголовки и значения.

$arr = array_chunk($newarray, 4, true);
echo "<table>\n";
foreach($arr as $sub){
    echo "<tr><th>" . implode("</th><th>", array_keys($sub)) . implode("</th><th>", array_slice([" ", " ", " "],0 , 4-count($sub)))  . "</th></tr>\n";
    echo "<tr><td>" . implode("</td><td>", $sub) . implode("</td><td>", array_slice([" ", " ", " "],0 , 5-count($sub))) ."</td></tr>\n";
}
echo "</table>";

Вывод:

<table>
<tr><th>make</th><th>model</th><th>model_year</th><th>made</th></tr>
<tr><td>Ford</td><td>S-MAX</td><td>2009</td><td>2010-01-01 </td></tr>
<tr><th>manufacturer</th><th>manufacturer_address</th><th>body</th><th>engine_power_kw</th></tr>
<tr><td>Ford Werke AG</td><td>Koeln-Niehl, Germany</td><td>Sedan/Saloon</td><td>142 </td></tr>
<tr><th>engine_displacement_ccm</th><th>engine_full </th><th> </th></tr>
<tr><td>2000</td><td>2.0L Duratorq-TDCi (143PS) - DW </td><td> </td><td> </td></tr>
</table>

https://3v4l.org/TrCnM

Отредактировано для включения пустых ячеек.

1 голос
/ 12 мая 2019

Вы можете просто расширить массив, чтобы он был кратен 4 элементам перед началом:

for ($c = count($newarray); $c % 4 != 0; $c++) {
    $newarray[str_repeat("\n", $c % 4)] = '';
}
$rama_result.='<table class="table w100 customtable">';
$i=1;
// ...

Демонстрация на 3v4l.org

1 голос
/ 12 мая 2019

После цикла вы можете проверить, что в $rama_result1 есть что-то еще - что означало бы, что в таблице остались данные для добавления.Этот код дополняет существующее содержимое достаточным количеством пустых ячеек, чтобы оно соответствовало четырем столбцам (при необходимости вы можете настроить содержимое при вызовах str_repeat()).

if ( $rama_result1 != '' )  {
    $i--;
    $rama_result1 .= str_repeat("<th />", 4-($i%4));
    $rama_result2 .= str_repeat("<td />", 4-($i%4));
    $rama_result.='<tr>'.$rama_result1.'</tr><tr>'.$rama_result2.'</tr>';
}

Также (как отметил Ник)Есть дополнительные <tr> теги в разных местах.Я обновил несколько других частей кода, чтобы попытаться привести в порядок сгенерированный HTML ...

$i=1;
foreach($newarray as $key=>$value){
    $rama_result1.= '<th>'.$key.'</th>';
    $rama_result2.= '<td>'.$value.'</td>';

    if($i % 4 == 0){
        $rama_result.='<tr>'.$rama_result1.'</tr><tr>'.$rama_result2.'</tr>'.PHP_EOL;
        $rama_result1 = '';
        $rama_result2 = '';
    }
    $i++;
}
if ( $rama_result1 != '' )  {
    $i--;
    echo ($i%4).PHP_EOL;

    $rama_result1 .= str_repeat("<th />", 4-($i%4));
    $rama_result2 .= str_repeat("<td />", 4-($i%4));
    $rama_result.='<tr>'.$rama_result1.'</tr><tr>'.$rama_result2.'</tr>'.PHP_EOL;
}
$rama_result.='</table>';
...