【问题标题】:Grouping WHILE loop results对 WHILE 循环结果进行分组
【发布时间】:2011-07-27 01:21:12
【问题描述】:

目前我正在使用 WHERE 循环在我的数据库中显示 2 列信息。代码如下:

$sql2 = sprintf($rawsql2, mysql_real_escape_string($id));
$result2 = mysql_query($sql2);

/*These if & while statements decide whether or not the information should be displayed. If no results are returned from the query above then an alternative message is shown.*/

if (mysql_num_rows($result2) > 0) {
    while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
        echo $row["open"] . "-" . $row["close"] . "<br/><br/>";
    }
}
else {
    echo "Error";
}

这会输出以下内容:

08:00:00-12:30:00

13:30:00-16:30:00

09:00:00-17:00:00

18:00:00-20:00:00

09:00:00-17:00:00

18:00:00-20:00:00

08:00:00-17:00:00

18:00:00-20:00:00

09:00:00-17:00:00

18:00:00-20:00:00

现在,我需要做的是每隔 2 行进行分组,所以它看起来像:

08:00:00-12:30:00 13:30:00-16:30:00

09:00:00-17:00:00 18:00:00-20:00:00

09:00:00-17:00:00 18:00:00-20:00:00

08:00:00-17:00:00 18:00:00-20:00:00

09:00:00-17:00:00 18:00:00-20:00:00

这可能吗?感谢您的帮助

编辑:感谢大家的所有答案...我使用了 Shakti 的答案,因为这是我看到的第一个答案,但看起来每个人都非常相似。

【问题讨论】:

    标签: php tags while-loop if-statement


    【解决方案1】:
    if(mysql_num_rows($result2) > 0)
    {
        $count=0;
        while ($row = mysql_fetch_array($result2, MYSQL_ASSOC))
        {    
            echo $row["open"] . "-" . $row["close"] ;
            if ($count % 2 !=0 )
            {
               echo  "<br/><br/>"; 
            } 
            $count++;    
        }
    }
    

    【讨论】:

    • +1 表示解决方案。 -1 表示可怕的、不一致的格式。
    【解决方案2】:
    $sql2 = sprintf($rawsql2, mysql_real_escape_string($id));
    
    $result2 = mysql_query($sql2);
    
    /*These if & while statements decide whether or not the information should be displayed. If no results are returned from the query above then an alternative message is shown.*/
    int row_count=mysql_num_rows($result2)
    if(row_count > 0) {
        while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
            row_count--;
            echo $row["open"] . "-" . $row["close"] ;
            if(row_count > 0 && ($row = mysql_fetch_array($result2, MYSQL_ASSOC)){
              row_count--;   
              echo $row["open"] . "-" . $row["close"] ;
             }
            "<br/><br/>"
    
    
        }
    } else {
            echo "Error";
    }
    

    应该这样做,如果有奇数你可能需要抓住

    【讨论】:

    • @Steven:再次检查mysql_num_rows($result2) 有什么意义?
    • @Tomalak,如果没有要获取的数组,为什么还要获取数组?但你是对的,它是不需要的。在这方面,甚至一开始就不需要第一个。
    • @Steven:我认为你误解了mysql_num_rows 的作用。第二个和第一个完全一样。因此,虽然您认为第一个是正确的,但如果 已使用,那么第二个就更加多余了。
    • @Tomalak,它不返回当前剩余的行数吗?所以在每个 mysql_fetch_array 之后它的值都会减少。还是返回最初返回的行数?无论哪种方式,我觉得计数器会更好,以减轻服务器负载,即使它只是一个请求
    • @Steven:不。它是记录集中的行数,无论您在哪里迭代该记录集。当您读出它们时,这些行并不会不复存在。您可以随时查找记录集中的任何点。一次前进一个只是最常见的用例。 (我同意,计数器是一个更好的主意。)
    【解决方案3】:
      $i=1;
      while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
        if ($i == 1) {
          echo $row["open"] . "-" . $row["close"];
          $i++;
        } else {
          echo $row["open"] . "-" . $row["close"] . "<br /><br />";
          $i=1;
        }
    

    【讨论】:

    • 你有一个语法错误(额外的;)和大量的代码重复。
    【解决方案4】:
    if($result2) { 
        $printTimes = function($r) {echo $row["open"] . "-" . $row["close"];};
        $newLine = false;
        while ($row = mysql_fetch_assoc($result2)) 
        {
            $printTimes($row);
            echo $newLine ?  '<br /><br />' : ' ';
            $newLine = !$newLine;
        }
    }
    

    【讨论】:

    • 您复制了 MySQL 访问权限。有点过分了。
    • 我的代码中没有 MySQL 访问权限。你指的是我以前是怎么拿两次的?我决定我更喜欢这个,但无论如何我看不出有什么问题
    • @jon_darkstar:正确。您有两次提取,从 MySQL 记录集中检索。任何人都猜测这相当于“没有 MySQL 访问权限”...
    • 因为访问权限在mysql_query。之后的一切都只是使用从查询返回的资源对象
    • 我最初考虑循环一半的次数并在每个循环中调用两次而不是一次函数。我决定反对,但保留这样做的权利。我坚持认为它的形式无论如何都不是特别糟糕,鉴于您自己的代码中的实际错误,您的评论很愚蠢。
    【解决方案5】:
    if(mysql_num_rows($result2) > 0){
        $counter = 0;
        while($row = mysql_fetch_array($result2, MYSQL_ASSOC)){
            echo $row["open"] . "-" . $row["close"] . " ";
            if(++$counter % 2 == 0){
              echo "<br/><br/>";
              $counter = 0;
            } 
        }
    }
    

    【讨论】:

    • 那个计数器最终会用完。最好随时更改$counter 的值。
    • @Tomalak:除非他从 db 查询返回 2,147,483,647 行,否则我认为这没有什么区别。
    • 2,147,483,647 行将创建一个超过 40GB 的文件。我没见过这么大的东西。
    • Tomalak - 别再把这些小问题带到大家的回答中了。整数溢出的问题与这个问题无关
    • 此代码在 64 位 PHP 上是安全的。它在 32 位 PHP 上也应该是相当安全的。该数字将转换为 64 位浮点数。在大约 10 年的时间里,为浏览器创建 40GB 的 html 文件将是非常疯狂的。
    【解决方案6】:

    试试这个:

    $lines = 1;
    if(mysql_num_rows($result2) > 0) {
        while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
    
            echo $row["open"] . "-" . $row["close"];
            echo (($lines%2 == 0)?"<br/><br/>":'');
            $lines++;
    
        }
    } else {
            echo "Error";
    }
    

    【讨论】:

      【解决方案7】:

      仅在循环的每隔次迭代中输出&lt;br/&gt;&lt;br/&gt;。 (顺便说一句,&lt;p&gt;&lt;ul&gt;&lt;div&gt; 会更符合语义。)

      $counter = 0;
      while ($row = mysql_fetch_array($result2, MYSQL_ASSOC)) {
      
          echo $row["open"] . "-" . $row["close"] . " ";
      
          // Break line after every two items
          $counter = ($counter + 1) % 2;
          if ($counter == 0)
              echo "<br/><br/>";
      }
      

      【讨论】:

      • $counter 不算什么。这是切换的浪费版本。 num_rows 命令毫无意义 - 如果 $result2 为 false 而不是资源,则仍然存在错误,并且如果它是具有零行的正确资源,则 while 正文将永远不会运行
      • @jon_darkstar:它以2为模计算行数。如何“浪费”?它一个切换。如果您建议我使用整数而不是布尔值来“浪费空间”,那么我的回答是我让 PHP 担心这样的微优化。三个字节,即使使用,也不会杀死任何人。
      • 你要吹毛求疵,我也可以吹毛求疵。我知道性能差异并不重要,但名字仍然很烂
      • @jon_darkstar:我一点也不吹毛求疵。我当然不会反对任何人。
      • 你在这里几乎每一个答案上都放了一些小技巧。如果你能把它拿出来,那就学习如何拿走它。我的回答中从未有过mysql_num_rows,我表示在您提及它或将其从您的回答中删除之前,这是毫无意义的。同样,在 Rocket 的回答中,您在 $counter 溢出的可能性应该是一个有争议的问题时发生争执。它只是一个奇偶校验布尔值,应该这样对待。先生好日子
      【解决方案8】:

      我的代码版本。

          $sql2 = sprintf($rawsql2, mysql_real_escape_string($id));
          $result2 = mysql_query($sql2);
      
          if(mysql_num_rows($result2) > 0) {
              while (true) {
                  $row1 = mysql_fetch_array($result2, MYSQL_ASSOC);
                  $row2 = mysql_fetch_array($result2, MYSQL_ASSOC);
                  if (!($row1 and $row2)) break;
                  echo $row1["open"] . "-" . $row1["close"] . " ";
                  echo $row2["open"] . "-" . $row2["close"] . "<br/><br/>";
              }
          } else {
              echo "Error";
          }
      

      【讨论】:

        猜你喜欢
        • 2021-07-06
        • 2015-06-05
        • 1970-01-01
        • 2014-12-05
        • 2019-07-12
        • 2019-12-19
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多