【问题标题】:Dynamically create HTML table rows based on php array基于php数组动态创建HTML表格行
【发布时间】:2012-05-05 03:14:15
【问题描述】:

我很难理解以下内容。我想基于 PHP 数组为每行表构建一个 3 个数据单元格。所以换句话说,如果数组中有3个值,应该有这样的结构:

<?php
$arr = array("value1","value2","value3");
?>

// Expected outcome:
<table>
      <tr>
           <td>value1</td>
           <td>value2</td>
           <td>value3</td>               
      </tr>
</table>

但如果第 4 个值被添加到数组中,它必须动态创建另一行,换句话说:

<?php
$arr = array("value1","value2","value3","value4");
?>

// Expected outcome:
<table>
      <tr>
           <td>value1</td>
           <td>value2</td>
           <td>value3</td>               
      </tr>
      <tr>
           <td>value4</td>
           <td></td>
           <td></td>               
      </tr>
</table>

我真的不介意哪种解决方案,甚至是 php 和 jQuery 的混合,但只是我可以用来实现上述目标的东西。

【问题讨论】:

    标签: php jquery html-table


    【解决方案1】:

    使用模数。像这样:

    <table>
    <tr>
    <?php
        $i = 1;
        foreach ($arr as $val){
            $i++;
            print '<td>'.$i.'</td>';
            if ($i % 3 == 0){
                print '</tr><tr>'^;
            }
    
        }
    ?>
    </tr>
    </table>
    

    您需要添加更多内容才能正确输出 html,但“硬”部分已完成。

    不要只是复制粘贴,我没有测试代码,很丑。

    【讨论】:

    • 您的代码在打印第三个单元格之前打印一个新行;行尾检查应该在打印所有单元格之后而不是之前;除此之外,您需要注意第一行开始标记 和最后一行结束标记 ..
    • 真的,谢谢。但正如我所说,它更多的是展示模数的使用,而不是提供一个有效的“复制和粘贴”解决方案。不过,你是对的,我改变了它。我故意留下了关于打开和关闭标签的代码。如果数组大小不是 3 的倍数,则还需要填充不足的 tr,依此类推..
    【解决方案2】:

    使用array_chunk 函数将数组分成组,然后执行几个循环,例如

    <?php
    $arr = array("value1","value2","value3","value4");
    echo "<table>";
    $rows = array_chunk($arr,3);
    foreach($rows as $row) {
      echo "<tr>";
      foreach($row as $cell) {
        echo "<td>".$cell."</td>";
      }
      echo "</tr>";
    }
    echo "</table>";
    ?>
    

    【讨论】:

    • 这可能有效,但不是最佳解决方案; array_chunk 和两个 foreach 循环太贵了。你不觉得吗?!
    • 是的,对.. 如果您认为两个循环太贵,尝试做三个!萨利赫,在评论之前做一些基准测试。这根本不会影响网络性能。还有数百种其他事情会破坏性能,而运行像这样的简单脚本不是其中之一。此外,他显然是个新手,而我的答案(我认为)是最明显的。
    • 无需对 $more_memory_allocation + $more_execution_tim = $too_expensive 进行基准测试,但如果您坚持使用 1000 个元素的数组和 1000 个访问者同时进行基准测试。
    【解决方案3】:

    这是一个逻辑实现:

    <?php
    $input_array = array('a', 'b', 'c', 'd', 'e','f','g');
    $new_array = array_chunk($input_array, 3);
    
    $table = '<table border="1">';
    foreach($new_array as $value){
    $table .= '<tr><td>'.$value[0].'</td><td>'.$value[1].'</td><td>'.$value[2].'</td>    </tr>';
    }
    $table.='</table>';
    
    echo $table;
    ?>
    

    【讨论】:

      【解决方案4】:
      <table><tr>
      <?php
      $arr = array("value1","value2","value3","value4","value5","value6","value7");
      
      for($i=0;$i<count($arr)%3;$i++)
        $arr[] = null;
      
      foreach($arr as $key => $val){
      
        if(($key)%3==0)
          echo '</tr><tr>';
      
        echo '<td>'.$val.'</td>';
      
      }
      ?>
      </tr></table>
      

      【讨论】:

        【解决方案5】:
        <table>
            <tr>
                <?php
                $x = 0;
                foreach($arr as $v){
                    if ($x % 3 == 0 && $x != 0){
                        echo '</tr><tr>';
                    }
        
                    echo '<td>'.$v.'</td>';
                    $x++;
                }
                ?>
            </tr>
        </table>
        

        【讨论】:

          【解决方案6】:

          这是我的建议,它将生成格式化的 html

          <table>
              <tr>    
              <?php
              $i = 0;
              $items_per_row = 3;
          
              foreach ($arr as $elm) {
                  echo '<td>'.$elm.'</td>';
          
                  if (++$i % $items_per_row == 0 && $i < count($arr) - 1)
                      echo '</tr><tr>';
              }
              ?>
              </tr>
          </table>
          

          【讨论】:

            猜你喜欢
            • 2011-05-20
            • 2019-11-19
            • 2021-07-24
            • 1970-01-01
            • 2019-02-26
            • 2019-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多