Разделить записи на две колонки - PullRequest
4 голосов
/ 09 января 2010

У меня есть таблица «ученик», содержащая около 5000 записей в моей БД Я хочу отобразить эти записи в двух делениях. Как мне это сделать, не выполняя запрос дважды; только с помощью одного запроса?

пример отображения http://www.freeimagehosting.net/uploads/f1c6bb41eb.gif

Ответы [ 8 ]

8 голосов
/ 09 января 2010

Просто используйте CSS3. Не уверен, насколько широко он поддерживается , но он избавляет от головной боли и намного эффективнее при внесении изменений.

Используйте column-count и column-width для управления количеством столбцов и шириной каждого столбца. Вот пример кода и довольно впечатляющие результаты. Префикс -webkit и -moz пока не стандартизирован во всех браузерах.

.multi-column {
    /* Standard */
    column-count: 2;
    column-width: 150px;
    /* Webkit-based */
    -webkit-column-count: 2;
    -webkit-column-width: 150px;
    /* Gecko-based */
    -moz-column-count: 2;
    -moz-column-width: 150px;
}

Применительно к этому <div>

<div class="multi-column">
    Ethelred of Wessex
    Louis XII of France
    George Frideric Handel
    George Washington
    Charles Deslandes
    Andrew Jackson
    Alfred Vail 
    William McKinley
    Woodrow Wilson
    Abdul-Aziz ibn Saud
    Fidel Castro
    Charles de Gaulle
    Leonardo da Vinci
</div>

Разве вы не хотите увидеть, как это выглядит после всей этой тяжелой работы?

alt text

<Ч />

Но что, если бы было 3 столбца? Нет проблем.

alt text

<Ч />

Но он никак не может обработать 4 столбца, которые вы скажете:

alt text

<Ч />

Довольно! Я должен прекратить добавлять их сейчас

alt text

<Ч />

Боже, пожалуйста, ОСТАНОВИТЕ !!

alt text

7 голосов
/ 09 января 2010

Просто найдите, где находится «середина», и выведите конечный тег тега div и начальный тег второго div:

<? 
$rowcount = mysql_num_rows($recordset);
echo "<div id='div1'>";
$i = 0;
while ($d = mysql_fetch_object($recordset)) {
  echo $d->somefield;
  $i++;

  if ($i == floor($rowcount / 2)) {
      //we have reached the mid-point, let's close the first DIV
      echo "</div><div id='div2'>";
  }
}
echo "</div>";
?>
2 голосов
/ 03 декабря 2011

get_column() функция может помочь, она будет рассчитывать столбец для каждого элемента, который вы хотите показать.

этот пример сценария показывает, как печатать в два столбца, но вы можете изменить его через две минуты, чтобы исправить ваши потребности, если вам нужно другое количество столбцов.

<?php


// sample query, get members 
$query = mysql_query("select name from persons");


// count total number of items to show
$total = mysql_num_rows($query);


// initiate row counter
$counter = 1;

// initiate columns contents
$column_1 = '';
$column_2 = '';
while($row = mysql_fetch_assoc($query)){

    // caluculate column for current element from total items to be showed number of     columns and current item
    $column = get_column($total, 2, $counter);

    if($column == 1){
        $column_1 .= $row['name'].'<br>';
        }

    if($column == 2){
        $column_2 .= $row['name'].'<br>';
        }


    $counter++;
    }

// show content in two table comments
echo "<table>
        <tr>
          <td>$column_1</td>
          <td>$column_2</td>
        </tr>
      </table>";

?>

и функция:

<?php
/**
 * Calculate column number where an item should be displayed on a "newspaper style"
 * or "phoneguide style" report  according its postion
 * used to put same number of items on each column
 * 
 * receive 3 numbers: $vp_total_size: total number of items on report
 *                    $vp_columns   : number of columns of report
 *                    $vp_element   : element position for item (1 to  $vp_total_size)
 *
 * by Marcos A. Botta <marcos DOT botta AT gmail DOT com>
 * 02/02/2007
 * 
 */
function get_column($vp_total_size, $vp_columns, $vp_element){

    if($vp_element <= 0){
        return 1;
        }

    if($vp_element < $vp_columns &&
       $vp_columns >= $vp_total_size){
    return $vp_element;
        }

    $vl_avg_items_by_column    = $vp_total_size / $vp_columns;

    $vl_items_on_first_columns = ceil($vl_avg_items_by_column);
    $vl_items_on_last_columns  = floor($vl_avg_items_by_column);

    $vl_column_limit = ($vl_avg_items_by_column - $vl_items_on_last_columns) *     $vp_columns;


    $vl_allocated_items = 0;

    for($i=1;$i<$vp_columns;$i++){

        if($i < $vl_column_limit ||
           "$i" == "$vl_column_limit"){
            $vl_items_on_current_column = $vl_items_on_first_columns;

            }
        else{
            $vl_items_on_current_column = $vl_items_on_last_columns;
            }


        $vl_allocated_items += $vl_items_on_current_column;

        if($vp_element <= $vl_allocated_items){
            return $i;
            }


        }

    return $vp_columns;
    } // get_column()

?>

удачи!

1 голос
/ 27 октября 2011

Почему бы вам не попробовать этот код, его просто использовать только css, легко понять, работая в ie и mozilla ...

<style type="text/css">

    .ulcol
    {
    float: left;
    width: 400px;
    margin: 0;
    padding: 0;
    list-style: none;
    }

    .licol
    {
    float: left;
    width: 200px; /*half width of the ulcol width*/
    margin: 0;
    padding: 0;
    } 

    </style>

    <?php

    $query = mysql_query("select * from table_name") or die("Error Occured,check again");

    echo '<ul class="ulcol">';

    while($row = mysql_fetch_assoc($query))
    {
    $vartitle       =   $row[db_row_title];
    echo '<li class="licol">';
    echo $vartitle
    echo '</li>';
    }
    echo '</ul>';
    ?>
1 голос
/ 09 января 2010

Моя реализация:

<?php
$students = array(1,2,3,4,5);
$split = floor(count($students)/2);

echo '<div id="parent"><div id="col-1">';

$i = 0;
foreach($students as $student)
{
  echo 'Student #' . $student . '<br />';
  if($i == $split)
  {
    echo '</div><div id="col-2">';
  }
  $i++;
}

echo '</div></div>';

Использование только функций CSS3 Webkit / Moz, на мой взгляд, очень плохая практика.

0 голосов
/ 09 января 2010

Я предпочитаю свести к минимуму любое раннее использование «эхо», потому что завтра вы захотите переместить это в функцию или метод, где следует избегать «эха». Более того, с «эхом» в цикле вы потеряли структуру массива, присущую базам данных, и вам нужна эта структура для манипулирования вашими данными. Поэтому я бы предпочел заполнить массив, обработать его, а затем выполнить вывод.

И я бы использовал стилизованные маркеры для отображения элементов, потому что вы, очевидно, хотите отобразить список элементов. В псевдо-php код:

while row = fetch(sql)
  lines[] = "<li>row_data</li>"
end

// work on the lines array, eg insert "</ul><ul>" in the middle
echo "<ul>".implode("\n",lines)."</ul>"
0 голосов
/ 09 января 2010

Попробуйте что-то вроде этого

// connection goes there
$q = "SELECT `name` FROM students";
$result = mysql_query($q);
$students = array();
while($row=mysql_fetch_assoc($result)) {
       $students[] = $row['name'];
}
$students_count = sizeof($students);
// chunkes into a two parts , want more columns ? just change "2" to other number
$students_chuncked =  array_chunk($students,ceil($students_count/2),true); 

//now display
foreach ($students_chuncked as $student_div_data){
   echo '<div>',explode($student_div_data,'<br/>'),'</div>';
}
0 голосов
/ 09 января 2010

Может быть, разбить массив на две части, затем развернуть их, а затем напечатать обе половины на каждом элементе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...