将记录拆分为两列

时间:2010-01-09 08:01:27

标签: php mysql

我的数据库中有一个“学生”表,大约有5,000条记录。我想在两个 div中显示这些记录。如何在不执行两次查询的情况下执行此操作;只使用一个查询?

display example http://www.freeimagehosting.net/uploads/f1c6bb41eb.gif

8 个答案:

答案 0 :(得分:8)

只需使用CSS3。不确定supported有多广泛但节省了很多头痛,并且在进行更改时功能更强大。

使用column-countcolumn-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

答案 1 :(得分:7)

找到“中间”的位置并输出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 :(得分:2)

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()

?>
祝你好运!

答案 3 :(得分:1)

我的实施:

<?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功能非常糟糕。

答案 4 :(得分:1)

为什么不尝试这个代码,它只使用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>';
    ?>

答案 5 :(得分:0)

也许将数组拆分成两个然后内爆它们然后在每个div上打印两半。

答案 6 :(得分:0)

尝试这样的事情

// 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>';
}

答案 7 :(得分:0)

我更喜欢尽量减少“echo”的早期使用,因为明天你会想要在函数或方法中移动它,其中应避免使用“echo”。而且,循环中的“echo”你丢失了数据库固有的数组结构,你需要这个结构来操作你的数据。所以我宁愿填充一个数组,处理它,然后内爆输出。

我会使用样式化的项目符号来显示项目,因为您显然希望显示项目列表。在伪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>"