【问题标题】:PHP alternating colorsPHP 交替颜色
【发布时间】:2011-02-25 19:53:30
【问题描述】:
$dbc = mysql_connect('localhost','root','') or die (mysql_error()); mysql_select_db('payroll') 或死 (mysql_error()); $sql = "SELECT * FROM employee ORDER BY employee_id DESC"; $result = mysql_query($sql); 而($row = mysql_fetch_array($result)) { 回声“ ".$row['first_name']." “.$row['last_name']。”   "; }

我想在循环中添加交替颜色。我应该添加什么代码?

【问题讨论】:

    标签: php


    【解决方案1】:

    在循环外使用预定义的颜色。

    $rowCount = 0;
    $color = array('#ffffff','#f3f3f3');
    while($row = mysql_fetch_array($result)){
        $i = ($rowCount % 2); 
        echo "<element bgcolor='".$color["$i"]."'></element>";
        $rowCount++;
    }
    

    【讨论】:

      【解决方案2】:

      已经有很多解决方案了,但是这个只用了两行css。

      您可以在偶数行和奇数行上设置特定的 css:

      tr:nth-child(even) {background: #CCC}
      tr:nth-child(odd) {background: #FFF}
      

      【讨论】:

      • +1 我要做的唯一改变是我将定位td 元素而不是tr 元素(即tr:nth-child(even) td)并且我会使用background-color反而。但是,假设您不需要支持 IE8,这是最简单的解决方案。
      • 这个得到我的投票。非常容易实现,并且完全独立于任何服务器端实现。我很惊讶还有这么多其他建议!
      • 也投了赞成票。这是最优雅的解决方案,因为它不需要不必要的 PHP,而且如果您改变主意(就像每第三行也有另一种颜色),使用最少的 CSS 很容易进行调整。
      【解决方案3】:

      我是这样做的:

      记得添加一个名为“even”的 CSS 类,当然还有样式。

      <?php
      include 'connect.php';
      echo "<table id='hor-zebra'>";
      $i = 0;
      while($row = mysql_fetch_array($result))
      {
         if($i % 2 == 0)
         {
            echo "<tr class='even'>";
            echo "<td>" . $row['something'] . "</td>";
            echo "</tr>";
         }
      
         else
         {
            echo "<tr>";
            echo "<td>" . $row['something'] . "</td>";
            echo "</tr>";
         }
         $i++;
      }
      echo "</table>";
      
      mysql_close($con);
      ?>
      

      【讨论】:

        【解决方案4】:

        使用 CSS 类而不是内联样式。它们更容易操纵。然后在您的 CSS 中设置 .myclass_row_0.myclass_row_1 的样式以作为备用行颜色,并为 .col1.col2 设置列样式。

        $c=1; // or 0 (added after deceze's comment)
        while($row = mysql_fetch_array($result)) {
          $c=1-$c; // magic!
        
          echo "
            <tr class=\"myclass_row_$c\">
              <td class=\"col1\">".$row['first_name']." ".$row['last_name']."</td>
              <td class=\"col2\"><input type=\"button\" name=\"edit\" value=\"Edit\" class=\"selbtn\">&nbsp;<input type=\"button\" name=\"delete\" value=\"Delete\" class=\"selbtn\"></td>
            </tr>
          ";
        }
        

        或者使用内联样式:

        $colors = array('#ffffff','#f3f3f3');
        $c=1;
        while($row = mysql_fetch_array($result)) {
          $c=1-$c;
        
          echo "
            <tr style=\"background-color:{$colors[$c]};\">
               <!-- tds here -->
            </tr>
          ";
        }
        

        或者使用预设类:

        $styles = array('odd','even');
        $c=1;
        while($row = mysql_fetch_array($result)) {
          $c=1-$c;
        
          echo "
            <tr class=\"{$styles[$c]}\">
               <!-- ... -->
            </tr>
          ";
        }
        

        【讨论】:

        • 哈哈,非常有创意的魔法,虽然我至少会在循环开始之前声明$c = 0。 :)
        • 虽然答案不使用模板,但和其他人一样,它可以很容易地转换为模板使用。
        【解决方案5】:

        因为它已经被撞了,这是我的 5 美分。

        7 个答案,而不是一个使用模板的答案。
        我们可以写一千篇模板必要性的文章,但这样的例子总是会赢。

        所以,根据 OP 的代码和 stagas 的回答:

        业务逻辑部分:

        $c      = 1;
        $DATA   = array();
        $sql    = "SELECT * FROM employee ORDER BY employee_id DESC";
        $result = mysql_query($sql) or trigger_error(mysql_error().$sql);
        while($row = mysql_fetch_array($result)) {
          $row['c'] = $c=1-$c;
          $DATA[] = $row;
        }
        

        和模板部分:

        <tr class="myclass_row_<?=$row['$c']?>">
          <td class="col1"><?=$row['first_name']?> <?=$row['last_name']?></td>
          <td class="col2">
            <input type="button" name="edit" value="Edit" class="selbtn">&nbsp;<input type="button" name="delete" value="Delete" class="selbtn">
          </td>
        </tr>
        

        【讨论】:

          【解决方案6】:
          $rowCount = 0;
          $colorOne = '#ffffff';
          $colorTwo = '#f3f3f3';
          
          while($row = mysql_fetch_array($result)){
                  $rowColor = ($rowCount % 2) ? $colorOne : $colorTwo; 
                  echo "<element bgcolor='$rowColor'></element>";
          $rowCount++;
          }
          

          Edited after @Jayrox comment.

          【讨论】:

          • 运行 if-then-else 语句比定义一堆变量然后运行 ​​if-then-else 更好。我们绝对不想为结果中的每一行重新定义这些颜色。
          • 应该这样做。但是,就像 animuson 提到的那样,我建议将颜色定义放在 while 循环之前。
          【解决方案7】:
          $class="even"
          while($row = mysql_fetch_array($result)) 
          {
            if($class == "even")
            {
              echo "<tr class='$class'>";
              $class="odd"
            }
            else
            {
              echo "<tr class='$class'>";
              $class="even";
            }
          
            ...
          
          }
          

          【讨论】:

          • 下面已经有一个几乎完全一样的答案。
          【解决方案8】:

          通常,我将声明一个 index(int) 值并在每次循环中递增。然后检查 index mod 2 = 1 是否。如果是,则输出一个带有您要应用的样式的 tr 以显示交替行。

          $color = 0;
          while($row = mysql_fetch_array($result)) {
          
            if($color % 2 == 1){
              echo "<tr>";
            }else{
              echo "<tr class=\"altRow\">";
            }
            echo "
            <td style=\"padding-left: 20px; border-bottom: 1px solid #999; border-right: 1px solid #999;\">".$row['first_name']." ".$row['last_name']."</td>
            <td style=\"text-align: center; border-bottom: 1px solid #999; border-right: 1px solid #999;  padding-top: 2px ; padding-bottom: 3px ;\"><input type=\"button\" name=\"edit\" value=\"Edit\" class=\"selbtn\">&nbsp;<input type=\"button\" name=\"delete\" value=\"Delete\" class=\"selbtn\"></td>
            </tr>
            ";
            $color++;
          }
          

          【讨论】:

          • 在表格行上定义一个类并不是一种非常有效的方法。大多数浏览器对表格行上的 CSS 属性有非常不同的渲染。否则,这是一个很好的方法。附言$color++ 看起来比 $color = $color + 1 好多了!
          • 同意,我只是不记得 PHP 是否有 ++ 操作数(在 .NET 领域已经有一段时间了)。就风格而言,我也同意,IE 是行样式的痛苦。只是想敲出一个如何使用 mod 操作的例子。
          【解决方案9】:

          只需跟踪它是否是带有布尔值的交替行。在循环之前将其初始化为false,而不是每次迭代都将其初始化,然后您可以根据其值设置行样式。比如:

          ...
          
          $isAlternatingRow = false;
          
          while($row = mysql_fetch_array($result)) {
          
              echo "
                 <tr class=\"" . $isAlternatingRow ? "defaultRow" : "alternatingRow" . "\">
                 <td style=\"padding-left: 20px; border-bottom: 1px solid #999; border-right: 1px solid #999;\">".$row['first_name']." ".$row['last_name']."</td>
                 <td style=\"text-align: center; border-bottom: 1px solid #999; border-right: 1px solid #999;  padding-top: 2px ; padding-bottom: 3px ;\"><input type=\"button\" name=\"edit\" value=\"Edit\" class=\"selbtn\">&nbsp;<input type=\"button\" name=\"delete\" value=\"Delete\" class=\"selbtn\"></td>
                 </tr>
                 ";
          
              $isAlternatingRow = !($isAlternatingRow);
          }
          

          然后为tr.defaultRow tdtr.alternatingRow td 定义样式。

          【讨论】:

            【解决方案10】:
            // here it is in less code
            
            <?php
             $dbc = mysql_connect('localhost','root','') or die (mysql_error());
              mysql_select_db('payroll') or die (mysql_error());
             $sql = "SELECT * FROM employee ORDER BY employee_id DESC";
            
              $result = mysql_query($sql);
              $colors = array('FFF', '000000'); // valid hex colors
              $numOfColors = sizeOf($colors); $i = 0
            
              while($row = mysql_fetch_array($result)) {
              $i++;if($i>$numOfColors){$i=0;}
            ?>
            
              <tr>
              <td style="padding-left: 20px; border-bottom: 1px solid #<?=$colors[$i]?>; border-right: 1px solid #<?=$colors[$i]?>;"> <?=$row['first_name']?> <?=$row['last_name']?> </td>
              <td style="text-align: center; border-bottom: 1px solid #<?=$colors[$i]?>; border-right: 1px solid #<?=$colors[$i]?>;  padding-top: 2px ; padding-bottom: 3px ;"><input type="button" name="edit" value="Edit" class="selbtn">&nbsp;<input type="button" name="delete" value="Delete" class="selbtn"></td>
              </tr>
            
            <?php
            
              }
            ?>
            

            【讨论】:

              【解决方案11】:
              $color = 1;
              while($row = mysql_fetch_array($result)) {
              
              if($color == 1){ 
                echo "
                <tr>
                <td style=\"padding-left: 20px; border-bottom: 1px solid #999; border-right: 1px solid #999;\">".$row['first_name']." ".$row['last_name']."</td>
                <td style=\"text-align: center; border-bottom: 1px solid #999; border-right: 1px solid #999;  padding-top: 2px ; padding-bottom: 3px ;\"><input type=\"button\" name=\"edit\" value=\"Edit\" class=\"selbtn\">&nbsp;<input type=\"button\" name=\"delete\" value=\"Delete\" class=\"selbtn\"></td>
                </tr>
                ";
              $color = 2;
              }
              else
              {
                echo "
                <tr>
                <td style=\"padding-left: 20px; border-bottom: 1px solid #555; border-right: 1px solid #555;\">".$row['first_name']." ".$row['last_name']."</td>
                <td style=\"text-align: center; border-bottom: 1px solid #555; border-right: 1px solid #555;  padding-top: 2px ; padding-bottom: 3px ;\"><input type=\"button\" name=\"edit\" value=\"Edit\" class=\"selbtn\">&nbsp;<input type=\"button\" name=\"delete\" value=\"Delete\" class=\"selbtn\"></td>
                </tr>
                ";
                }
              $color = 1;
              }
              

              【讨论】:

              • 一旦颜色设置为 2,它就永远不会恢复为 1。在第一个样式之后不会显示交替样式。
              • 甜蜜,我想我可能更喜欢你的方法,看起来直接比较比模数和加法运算快一点。也许另一个SO问题? :)
              • 这会浪费很多原本不需要使用的额外字符。
              猜你喜欢
              • 1970-01-01
              • 2010-09-20
              • 1970-01-01
              • 2011-10-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-17
              相关资源
              最近更新 更多