【问题标题】:PHP loop to sort tablePHP循环对表进行排序
【发布时间】:2011-09-30 20:27:33
【问题描述】:

我正在数据库中查询按字母顺序编号为 1-26 的名称。我有以下代码,但由于 HTML 的结构是 tr 然后 td,因此表格按字母顺序按行而不是按列显示。如何让它按列顺序显示?

$query = mysql_query("SELECT name FROM people WHERE main=1 ORDER BY id");
$i = 0;
while($result = mysql_fetch_array($query)) {
    $name = $result['name'];
    if ($i % 5 == 0) echo "<tr>\n";
    echo "<td width=\"150\">";
    echo "<a href=\"#".strtolower($name)."\">".$name."</a><br />";
    echo "</td>\n";
    $i++;
    if ($i % 5 == 0) echo "</tr>\n";
};

阿尔法贝塔查理
三角回声狐步舞

对比

阿尔法查理回声
Beta Delta 狐步舞

另外,如果有更有效的方法,我愿意重新编写代码。

【问题讨论】:

  • 你想要什么??我真的到现在才知道??哪一个是你想要的输出??

标签: php mysql html-table


【解决方案1】:

您可以大步访问输出数组。用结果数除以 5 计算您需要多少行,并使用行数作为步幅。

$ncols = 5;
$nrows = $nresults / $ncols + ($nresults % $ncols == 0 ? 0 : 1);

for ($i = 0; $i < $nrows; $i++)
{
   // start row
   for ($j = 0; $k < $ncols; $j++)
   {
     // print $results[$nrows * $j + $i]
   }
   // end row
}

您必须首先将查询结果传输到数组$results。由于您必须知道结果的总数,因此这是强制性的,不过我很好奇是否有人有一个可以在获取结果的同时工作的解决方案。

更新: 请参阅 Justin 的回答,了解一个很酷的解决方案,它可以在逐行获取查询结果的同时增加输出。由于它目前正在开发中,这里有一个摘要(贾斯汀的学分):

$nresults = mysql_num_rows($query);
$ncols = 5;
$nrows = (int) ceil($nresults / $ncols);

$i = 0; $cols = array_fill(0, $nrows, "");

while ($result = mysql_fetch_array($query))
  $cols[$i++ % $nrows] .= "<td>$result['name']</td>";

echo "<tr>" . implode("</tr><tr>", $cols) . "</tr>";

【讨论】:

    【解决方案2】:

    编辑:

    经过我自己Kerrek SB和OPbswinnerton在cmets中的讨论,下面的代码似乎是最有效的:

    $columns = 3;
    $rowcount = mysql_num_rows($query);
    $rows = ceil($rowcount / $columns);
    $rowdata = array_fill(0, $rows, "");
    $ctr = 0;
    while ($result = mysql_fetch_array($query))
        $rowdata[$ctr++ % $rows] .= '<td>'.$result['name'].'</td>';
    echo '<tr>'.implode('</tr><tr>',$rowdata).'</tr>';
    

    这将创建三个,垂直填充(我原来的答案是创建三个)。它还正确地初始化了数组(防止 PHP 警告),为不能被列数整除的结果计数产生正确的行计数,并结合了 Kerrek 巧妙的“下标计算行”技巧。

    原帖:

    你可以使用数组和 implode() 这样,你只需要通过你的结果:

    $row = 0;
    $rows = 3;
    $rowdata = array();
    while($result = mysql_fetch_array($query))
    {
       if ($row >= $rows) $row = 0;
       $rowdata[$row++] .= '<td>'.$result['name'].'</td>';
    }
    
    echo '<tr>'.implode('</tr><tr>',$rowdata).'</tr>';
    

    【讨论】:

    • 酷。更简单:$rows[$i % $columns] .= "&lt;td&gt;$result['name']&lt;/td&gt;"; 永远不需要您的 $col 。但是请在周围保留一个柜台$i
    • @Kerrek:$col 可以用来对输出做一些事情,比如为td 分配一个类或其他东西。为了溶液的清晰度而移除。另外,我假设您的意思是$rows[$row++ % $columns]?
    • 不抱歉,我的意思是$i % $columns。没有$row,只是一个连续的计数器$i。不过,我认为您的数组 $rows 确实应该称为 $cols
    • 根据您的建议使用版本更新答案。我以前从没想过在数组下标内做数学运算。聪明的!另外,我称它为 $rows 是因为它就是一个由tr 内容组成的数组(可以通过在末尾用&lt;tr&gt;&lt;/tr&gt; 包装它们来证明)。
    • 你可能会说像$nrows = ($nresults - 0.1) / $ncols + 1; 这样的疯狂的话来获得正确的行数,但我内心的整数类型却不寒而栗。等待。更好的是:$ceil($nresults / $ncols)。哦。
    猜你喜欢
    • 2018-01-31
    • 2013-01-19
    • 1970-01-01
    • 2021-12-10
    • 2018-07-29
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多