PHP цикл для сортировки таблицы - PullRequest
3 голосов
/ 08 июля 2011

Я запрашиваю базу данных для имен, которые нумеруются 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";
};

Альфа Бета Чарли
дельта эхо фокстрот

против.

Альфа Чарли эхо
бета дельта фокстрот

Кроме того, я открыт для доработки кода, если есть более эффективный способ.

Ответы [ 2 ]

5 голосов
/ 08 июля 2011

Вы можете просто получить доступ к выходному массиву с ходу. Вычислите, сколько строк вам нужно, как количество результатов, разделенное на 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. Поскольку вам нужно знать общее количество результатов, это является своего рода обязательным, хотя мне было бы любопытно, есть ли у кого-нибудь решение, которое может работать при получении результатов.

Обновление: См. Ответ Джастина для классного решения, которое увеличивает вывод при извлечении результатов запроса построчно. Поскольку в настоящее время над ним ведутся работы, вот краткое изложение (благодарность Джастину):

$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 голосов
/ 08 июля 2011

Редактировать:

После обсуждения в комментариях между мной, Kerrek SB и ОП bswinnerton , кажется, что следующий кодбыть наиболее эффективным:

$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), возвращает правильное количество строк для количества результатов, которое не делится на количество столбцов, и включает в себя хитрый трюк Керрека «calc-row-in-the-subscript».

Исходное сообщение:

Вы можете использовать массивы и взорвать () Таким образом, вам нужно всего лишь сделать один проход через ваши результаты:

$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>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...