2008-10-20 129 views
1

我有来自MySQL的数据显示了一个客户得到的所有组织,以及每个组织中employess的所有详细信息。我想列出每一个组织的名字只有一次在一个单元(行间距),即在该组织所有员工对这个名字一样:如何使用PHP在行跨度中显示mysql数据?

Org1  Emp1 Name, Emp1 Phone, Emp1 Address 
     Emp2 Name, Emp2 Phone, Emp2 Address 


Org2  Emp1 Name, Emp1 Phone, Emp1 Address 
     Emp2 Name, Emp2 Phone, Emp2 Address 

如何显示这个数据,因为employess的每个组织的数量在高级中是不知道的,所以我不想设置rowspan的值。同样,我如何开始为其他组织开一排?我必须写两个查询吗?

很多谢谢。

回答

4

经典。

解决方法:只显示与上一个名称不同的名称。你甚至可以不用担心行间距(你保留一个空单元格)。

$currentOrg = ''; 
while ($row = mysql_fetch_object($query)) { 
    if ($row->org != $currentOrg) { 
     echo "$row->org". 
    } 
    $currentorg = $row->org; 
} 

不是最美丽但非常简单。

4
// Get the data 
$data = mysql_query('SELECT org, emp_name, emp_phone, emp_address FROM x'); 

// Store it all in a 2D array, keyed by org 
$rows = array(); 
while ($row = mysql_fetch_assoc($data)) 
{ 
    // Initialise each org to an empty array (not really needed in PHP but I prefer it) 
    if (empty($rows[$row['org']])) 
     $rows[$row['org']] = array(); 

    $rows[$row['org']][] = $row; 
} 

// Print it out 
foreach ($rows as $org => $employees) 
{ 
    print('<tr><td rowspan="' . count($employees) . '">' . htmlentities($org) . '</td>'); 

    foreach ($employees as $i => $employee) 
    { 
     // If $i == 0, we've already printed the <tr> before the loop 
     if ($i) 
      print('<tr>'); 

     print('<td>......</td></tr>'); 
    } 
} 
+0

我投了你的答案是唯一的人至今使用htmlentities()来转义输出。不过,我可能会在这里使用sprintf()而不是连接。 – 2008-10-20 18:16:13

0

要做出正确的rowspan,您需要提前知道该号码。

这使得您:

  • 迭代查询结果两次,计数的值,直到他们改变
  • 询问DB服务器为计数

就个人而言,我会去的方法第二。数据库服务器对计数行非常有效,当显示很多行时,这可能会快很多。

+0

如果您使用INNODB引擎,我不会推荐第二种方法。 – Gaurav 2008-10-20 16:34:30

0

对每个组织进行查询可能更容易(但效率较低)(加上一个查询来查找可能存在多少组织)。

更好的方法是预先循环访问数组。例如:

$sql = $mysqli->query('SELECT * FROM `organisation_members` ORDER BY `organisation` DESC'); 

if (!$sql || $sql->num_rows) { 
    // No data 
} else { 
    $data = array(); 
    while ($row = $sql->fetch_assoc()) {} 
     if (!array_key_exists($row['organisation'], $data)) { 
      $data[$row['organisation']] = array(); 
     } 
     $data[$row['organisation']][]['name'] = $row['name']; 
     // ... 
    } 
    $sql->close(); 
    echo '<table>'; 
    foreach ($data as $org => $people) { 
     $people_in_org = count($data[$org]) - 1; 
     $counter = 0; 

     echo '<tr>'; 
     echo '<td rowspan="' . $people_in_org + 1 . '">' . $org . '</td>'; 

     while ($counter < $people_in_org) { 
      if (counter > 0) { 
       echo '<tr>'; 
      } 
      echo '<td>' . $people[$counter]['name'] . '</td>'; 
      // etc 
      echo '</tr>'; 
     } 
    } 
    echo '</table>'; 
} 
0

为了节省内存,你可以遍历结果集,而组织是相同的缓冲行,当组织的变化,打印当前的批次,并开始缓冲下一批次。

0

它不会帮助您使用rowspan,但请查看WITH ROLLUP修改器。它以与您想要的相似的格式返回数据。

0

关于使用PEAR的HTML_Table包就像下面这个例子是什么,通过我也很喜欢Jrgns的ROLLUP版本

<?php 

    require_once "HTML/Table.php"; 




    $table = new HTML_Table(array('border'=>'1')); 
    $bo=array(
     array('6','a2','a3','a4'), 
     array('1','b2','b3','b4'), 
     array('1','c2','c3','c4') , 
     array('2','c2','c3','c4') , 
     array('2','c2','c3','c4') , 
     array('4','c2','c3','c4')); 

    foreach ($bo as $r => $borow) 
     $table->addRow($borow); 

    $rsFirst=0; 
    $rsLen=0; 
    foreach ($bo as $r => $borow) { 
     if ($r!=0 and $borow[0]!=$prevrow[0]) { 
      //jump in values 
      $table->setCellAttributes ($rsFirst,0, array('rowspan'=>$rsLen)); 
      $rsFirst=$r; 
      $rsLen=0; 
     } 
     $prevrow=$borow; 
     $rsLen++; 
     if ($r==sizeof($bo) - 1) { 
      $table->setCellAttributes ($rsFirst,0, array('rowspan'=>$rsLen)); 
     } 
    } 


    echo $table->toHTML(); 

    ?> 

塞尔瓦斯,boerl