PHP循环排序表

PHP循环排序表,php,mysql,html-table,Php,Mysql,Html Table,我正在查询数据库中按字母顺序编号为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

我正在查询数据库中按字母顺序编号为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";
};
$query=mysql\u query(“从人员中选择姓名,其中main=1 ORDER BY id”);
$i=0;
while($result=mysql\u fetch\u数组($query)){
$name=$result['name'];
如果($i%5==0)回显“\n”;
回声“;
回声“
”; 回音“\n”; $i++; 如果($i%5==0)回显“\n”; };
阿尔法-贝塔查理
三角洲回声狐步舞

vs

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


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

您可以快速访问输出数组。计算结果数除以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
}
编辑:

在我和OP之间的评论中讨论之后,以下代码似乎是最有效的:

$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>';
$columns=3;
$rowcount=mysql\u num\u行($query);
$rows=ceil($rowcount/$columns);
$rowdata=数组填充(0,$rows,“”);
$ctr=0;
while($result=mysql\u fetch\u数组($query))
$rowdata[$ctr++%$rows]。='.$result['name'.';
回显“”。内爆(“”,$rowdata)。“”;
这将创建三列,垂直填充(我的原始答案将创建三行)。它还正确初始化数组(防止PHP警告),为不可被列计数整除的结果计数生成正确的行计数,并采用Kerrek巧妙的“计算下标中的行”技巧

原创帖子:

您可以通过这种方式使用数组和内爆(),只需对结果进行一次遍历:

$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>';
$row=0;
$rows=3;
$rowdata=array();
while($result=mysql\u fetch\u数组($query))
{
如果($row>=$rows)$row=0;
$rowdata[$row++].='.$result['name'].';
}
回显“”。内爆(“”,$rowdata)。“”;

你想要什么??我真的到现在才知道??哪一个是你想要的输出?酷。更简单:
$rows[$i%$columns]。=“$result['name']”
您的
$col
永远不需要。但是要保留一个计数器,
$i
。@Kerrek:$col可以用来处理输出,比如给
td
分配一个类之类的东西。为了溶液的澄清,将其移除。另外,我假设你的意思是
$rows[$row++%$columns]
?不,对不起,我的意思是
$I%$columns
。没有
$row
,只有一个连续计数器
$i
。不过,我认为您的数组
$rows
应该真正被称为
$cols
!答案根据您的建议更新为一个版本。我以前从未想过在数组下标中进行数学运算。聪明!另外,我之所以称它为$rows,是因为它是一个
tr
内容的数组(在末尾用
包装它们就证明了这一点)以获得正确的行计数,但我内心的整数类型对此感到不寒而栗。等待甚至更好:
$ceil($nresults/$ncols)
。哦。
$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>';