使用PHP在表格中从上到下打印数组而不是从左到右

Posted

技术标签:

【中文标题】使用PHP在表格中从上到下打印数组而不是从左到右【英文标题】:Print Array Top to Bottom in table instead of Left to Right using PHP 【发布时间】:2018-03-14 14:13:39 【问题描述】:

我正在尝试编写一个逻辑来在表格中从上到下而不是从左到右显示记录。

这是我的尝试:

<?php $options = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); ?>
<table border="1" colspan="0" cellspan="0">
    <?php
    $htmldata = "";
    $counter = 1;

    $rowcount = ceil(count($options) / 3);

    for ($i = 0; $i < count($options); $i++) 
        echo $counter % 3 ."<br/>";

        if ($counter % 3 == 1) 
            $htmldata .= "<tr>";
            $htmldata .= "<td>".$options[$i]."</td>";
        
        if ($counter % 3 == 2) 
            $htmldata .= "<td>".$options[$i]."</td>";
        
        if ($counter % 3 == 0) 
            $htmldata .= "<td>".$options[$i]."</td>";
            $htmldata .= "</tr>";
        
        $counter++;
    
    echo $htmldata;
    exit;
    ?>
</table>

下表是当前代码输出。

但我需要表格这样输出。

我怎样才能做到这一点? 你们能帮我写这个逻辑吗? 此外,它目前显示 10 条记录,但可能或多或少,因此我们需要代码是动态的。

任何帮助将不胜感激。提前致谢!

注意:对于任意数量的记录,它必须只有 3 列,并且对于 10 条记录,输出必须与第二张图片示例中显示的相同。

【问题讨论】:

你的输出标准是什么?它必须是3列宽吗?如果你的数组中有 50 个项目,你希望它仍然是 3 列宽怎么办?请使用“限制”条件定义您想要的输出。 @Nic,是的,它必须只有 3 列。对不起,我忘了提。 为什么 8 到了第三列而不是第二列的底部?如果有 11 个值,那么 8 会转到第二列吗? @salathe 请参阅my answer 和后续的 cmets。我也有同样的想法。 @salathe 似乎他希望反映溢出记录的正常表格布局的外观,但希望以垂直顺序显示记录。 奇数 【参考方案1】:

试试这个:

<?php
$options = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16");
$elems = count($options);
// set the # of rows you want to show
$rows=5;
// calculate # of columns
$cols=ceil($elems/$rows);


echo "<table style='border: 2px solid black;'>";
for($r=0; $r<$rows; $r++)

    echo '<tr>';
    $shift=0;
    for($c=0; $c<$cols; $c++)
    
        echo "<td style='border: 1px solid blue;'>";
        if($r+$shift < $elems)
        
        echo $options[$r+$shift];
        
        echo '</td>';

        $shift+=$rows;
    
    echo '</tr>';

echo '</table>';
?>

【讨论】:

【参考方案2】:

试试这个:

<?php
function getTableHtml(array $data, int $colLength): string

    $result = '';

    $rowNumber = 0;
    $rows = [];
    foreach (array_values($data) as $k => $v) 
        if ($k % $colLength === 0) 
           ++$rowNumber;
           $rows[$rowNumber] = '';
        

        $rows[$rowNumber] .= '<td>';
        $rows[$rowNumber] .= htmlentities($v);
        $rows[$rowNumber] .= '</td>';
        $rows[$rowNumber] .= PHP_EOL; // optional formatting
    

    $result = '<table><tr>' . join('</tr><tr>', $rows) . '</tr></table>';

    return $result;

尝试直播:https://3v4l.org/A7erq

【讨论】:

【参考方案3】:

你可以做一些链接这个。首先以正确的方式循环和存储元素。然后简单地将它放在表中。 注意

您必须修复行或列(这里我假设您修复了 3 行)。您想要的输出有问题,因为第一行有 4 行,其他有 3

<?php 
$options = range(1,10);
$new_array = array();
$rows = 3;
foreach ($options as $value) 
  $new_array[$value % $rows][] = $value;    


?>
<table border="1" colspan="0" cellspan="0">
    <?php
        $htmldata = "";
        foreach ($new_array as $key => $value) 
          echo "<tr>";
          foreach ($value as $option) 
            echo "<td>".$option."</td>";
          
          echo "</tr>";
          
    ?>
</table>

输出将是

【讨论】:

输出必须与我在示例图像中显示的相同。【参考方案4】:

希望我的最终答案(在所有编辑之后)

<?php
// feel free to change the values in these variables
$options = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10");
$numCols = 3; // the number of columns to present
$pad = false; // whether to add blank <td> in final row

// don't alter these variables
$rows = (int)ceil(count($options) / $numCols); // number of rows of the column with most rows
$c = count($options) % $numCols; // how many columns have records on the final row
$col = 1; // current column

// iterate over the columns
for ($j = 0; $j < $numCols; $j++) 
    // iterate over rows
    for ($i = 0; $i < $rows; $i++) 
        // if iteration is last line and on a column with extra data
        // or if the iteration is not the last row
        // or if the last row perfectly fits the column count
        if (($col <= $c && $i == $rows - 1) || $i != $rows - 1 || $c == 0) 
            // remove the first element from the options array
            $arr[$i][$j] = array_shift($options);
        
    
    // move onto the next column
    $col++;


// create the extra <td> elements in the final row
if ($pad) 
    $arr[count($arr) - 1] = array_pad($arr[count($arr) - 1], $numCols, null);

?>
<table border="1" colspan="0" cellspan="0">
    <?php for ($i = 0; $i < count($arr); $i++)  ?>
    <tr>
        <?php for ($j = 0; $j < count($arr[$i]); $j++)  ?>
        <td><?= $arr[$i][$j]; ?></td>
        <?php  ?>
    </tr>
    <?php  ?>
</table>

我已经编辑了我最初发布的答案,因为它已损坏且冗长。此解决方案比以前的解决方案更简洁,效果更好。

在撰写此答案时,我还没有看到关于固定列数的编辑,因此有一个变量可以在必要时更改列数。随意更改列数 ($numCols) 以及数组中的元素数。如果您需要更改应用程序的要求,这里就在这里。

如果你愿意的话,你可以摆弄一些东西。它们如下:

$options 这只是您的数据数组。这可以是你想要的任何东西。表格将根据要求从上到下根据此数据创建。 $numCols 也许你想重命名这个,真的没关系。它是“列数”的缩写,正是如此;无论您在此处放置什么整数,您都会在该行中获得那么多 &lt;td&gt; 元素,或者,如果您不想以 HTML 方式读取它们,那么您将拥有那么多列以及随后的行数,具体取决于提供的数据. $pad 这是因为我注意到最后一行的记录较少 - 除非 $options 长度可以被 $numCols 整除,没有余数。 为了解决这个问题,我添加了这个选项。它在 for 循环创建数组后使用,并且只会用空值填充最后一行,这样最后一行的右侧就没有空格。 当然,是否需要完全取决于您。就个人而言,我会选择将 $pad 设置为 true,因为我认为它会使表格看起来更整洁。

我建议您不要更改其余代码,因为它会正常工作。 显然,如果你经常使用这段代码,那么你可以将它包装在一个函数中; 虽然如果你这样做,我强烈建议你不要像原来那样做,并开始创建一个字符串来存储你的表。 这是不好的做法,可能会导致错误。例如,您可能忘记关闭表格 - 您使用 exit 关键字执行的操作 - 许多现代浏览器不会注意到这一点,因为它们仍会显示所需的结果,但您的代码随后会使验证器失败。因此,如果您希望使用一个函数,请确保它只是 PHP 代码。然后只需在数组上调用它并像我最后所做的那样进行迭代(我的意思是,带有for循环的表部分不是函数的一部分)。

我真的不敢相信我花了这么长时间!

【讨论】:

第三行应该有 3 个值。但在你的例子中它只显示了 2 个值。 @DharmeshGoswami 您提供的输出在逻辑上不起作用。我会尝试来实现这一点。虽然我必须说这看起来很奇怪。对于这个不正确的答案,我深表歉意。 它出现在您使用变量 $carried 的原始版本中。抱歉,我没有注意到您已更新该代码。现在我尝试使用更新的代码,它对我来说工作正常。非常感谢..! @DharmeshGoswami 没问题,我决定在发布原始答案 10 小时后进行一些修改。我注意到有几件事导致它崩溃,所以我着手修复它们(并使代码更简单)! @DharmeshGoswami 我又对代码进行了更新。这将是最后一次更新。我希望这已经为你整理了一切。很高兴能为您服务!

以上是关于使用PHP在表格中从上到下打印数组而不是从左到右的主要内容,如果未能解决你的问题,请参考以下文章

如何在从左到右和从上到下排序的二维数组中搜索数字?

从上到下打印二叉树,同节点的从左到右。

从上到下按层打印二叉树,每层打印顺序从左到右

二维数组中的查找

求上到下打印出二叉树的每个节点三种题型

剑指Offer32-Ⅱ从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。