У меня в моей базе данных есть «студент», имеющий около 5000 записей. Я хочу показать эти записи в двух div. Как мне это сделать без выполнения запроса дважды; используя только один запрос?
пример отображения http://img.ruphp.com/php/www.freeimagehosting.net
Просто найдите, где находится «средний», и выведите конечный тег тега 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>"; ?>
Просто используйте CSS3. Не уверен, насколько широко он поддерживается, но сэкономит много головной боли и намного эффективнее при внесении изменений.
Используйте column-count
столбцы и ширину столбца для управления количеством столбцов и шириной каждого столбца. Вот пример кода и некоторые впечатляющие результаты. Префикс -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 http://img.ruphp.com/php/e00m02.png
Но что, если бы было 3 столбца? Нет проблем.
alt text http://img.ruphp.com/php/2gy3fo6.png
Но он не может обрабатывать 4 столбца, которые вы бы сказали:
alt text http://img.ruphp.com/php/2w3dez8.png
Достаточно! Я не хочу добавлять их сейчас
alt text http://img.ruphp.com/php/2mn3p5s.png
Боже, успокойтесь!
alt text http://img.ruphp.com/php/311pguq.png
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() ?>
удачи!
Моя реализация:
<?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 только на мой взгляд очень плохой практике.
Почему бы вам не попробовать этот код, его просто использовать только 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>'; ?>
Может быть, разбить массив на два, затем развязать их, а затем напечатать обе половины на каждом div.
Я предпочитаю свести к минимуму любое раннее использование «эха», потому что завтра вы захотите переместить это в функции или методе, где следует избегать «эха». Более того, с «эхом» в цикле вы потеряли структуру массива, присущую базам данных, и вам нужна эта структура для управления вашими данными. Поэтому я предпочел бы заполнить массив, обработать его, а затем разложить на вывод.
И я бы использовал стилизованные маркеры для отображения элементов, потому что вы, видимо, хотите отобразить список элементов. В псевдо-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>"
Попробуйте что-то вроде этого
// 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>'; }