【问题标题】:How do I display mysql data in row span using PHP?如何使用 PHP 在行跨度中显示 mysql 数据?
【发布时间】:2010-09-18 03:30:24
【问题描述】:

我有来自 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

如何显示此数据,因为每个组织的雇员人数在高级中是未知的,所以我不设置行跨度的值。同样,我如何为其他组织开始一行?我必须写两个查询吗?

非常感谢。

【问题讨论】:

    标签: php mysql html


    【解决方案1】:

    经典。

    解决方法:仅显示与前一个不同的名称。您甚至可以不关心行跨度(您保留一个空单元格)。

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

    不是最漂亮但就是这么简单。

    【讨论】:

      【解决方案2】:
      // 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>');
          }
      }
      

      【讨论】:

      • 我投票赞成你的答案,因为我是迄今为止唯一一个使用 htmlentities() 来转义输出的人。不过,我可能会在这里使用 sprintf() 而不是串联。
      【解决方案3】:

      要填写正确的rowspan,需要提前知道号码。

      剩下的就是:

      • 迭代查询结果两次,计算值直到它们改变
      • 向数据库服务器询问计数

      就个人而言,我会选择方法二。数据库服务器在计算行数方面非常有效,当有很多行要显示时,这可能会快很多。

      【讨论】:

      • 如果您使用的是 INNODB 引擎,我不推荐第二种方法。
      【解决方案4】:

      为每个组织进行查询可能更容易(但效率较低)(加上一个查询以查找大概有多少组织)。

      更好的方法是事先循环遍历数组。例如:

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

      【讨论】:

        【解决方案5】:

        为了节省内存,您可以在 org 缓存行时迭代结果集,当 org 更改时,打印当前批次并开始缓冲下一个批次。

        【讨论】:

          【解决方案6】:

          它不会帮助您处理行跨度,但请查看 WITH ROLLUP 修饰符。它以类似于您想要的格式返回数据。

          【讨论】:

            【解决方案7】:

            下面的例子中使用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();
            
                ?>
            

            servas,布尔

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-01-25
              • 2010-09-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-12-04
              • 2015-04-23
              • 1970-01-01
              相关资源
              最近更新 更多