代码之家  ›  专栏  ›  技术社区  ›  thrashr888

用PHP/HTML替换行颜色最简单的方法?

  •  25
  • thrashr888  · 技术社区  · 17 年前

    下面是我的一个PHP示例。有人能找到一种更短更简单的方法吗?

    <? foreach($posts as $post){?>
        <div class="<?=($c++%2==1)?‘odd’:NULL?>">
            <?=$post?>
        </div>
    <? }?>
    
    <style>
        .odd{background-color:red;}
    </style>
    

    其他语言的例子也很有趣。

    19 回复  |  直到 11 年前
        1
  •  46
  •   Vilx-    17 年前

    从根本上说-不,这是最简单的。你可能会把它改写得更短/更干净,但想法是一样的。我就是这样写的:

    $c = true; // Let's not forget to initialize our variables, shall we?
    foreach($posts as $post)
        echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
    
        2
  •  19
  •   ThiefMaster    12 年前

    如果您希望拥有更少的内嵌式PHP,最好的方法是通过JavaScript。

    使用jquery,它只是:

    <script type="text/javascript">
    $('div:odd').css('background-color', 'red');
    </script>
    
        3
  •  11
  •   Ole Helgesen    17 年前

    使用CSS3,您可以这样做:

    div:nth-child(odd)
    {
      background-color: red
    }
    

    但如果你真的想让你的用户看到颜色,最好不要在几年内使用它…

        4
  •  8
  •   gak    17 年前

    Smarty内置:

    {section name=rows loop=$data}
    <tr class="{cycle values="odd,even"}">
       <td>{$data[rows]}</td>
    </tr>
    {/section}
    

    Django也是这样:

    {% for o in some_list %}
        <tr class="{% cycle 'row1' 'row2' %}">
            ...
        </tr>
    {% endfor %}
    
        5
  •  5
  •   nickf    17 年前

    我总是将我的斑马行命名为“row0”和“row1”——这使得代码更简单。

    <?php  // you should always use the full opening tag for compatibility
    $i = 0;
    foreach ($rows as $row) {
        echo '<tr class="row' . ($i++ % 2) . '">...</tr>';
    } 
    ?>
    
        6
  •  3
  •   Paige Ruten    17 年前

    可能是带有静态变量的函数?

    <?php
    
    function alternate_row_color($css_class) {
        static $show = true;
    
        $show = !$show;
    
        if ($show) {
            return $css_class;
        } else {
            return NULL;
        }
    }
    
    ?>
    

    然后使用它(使用您的示例):

    <?php foreach($posts as $post) { ?>
        <div class="<?=alternate_row_color('odd')?>">
            <?=$post?>
        </div>
    <?php } ?>
    
        7
  •  2
  •   navitronic    17 年前
    <?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
    <div<?php echo $alt ? ' class="odd"' : ''; ?>>
        <!-- Content --> 
    </div>  
    <?php endforeach ?>
    

    这将是最简单、最清晰的方法。

        8
  •  2
  •   strager    17 年前

    您可以按如下方式封装逻辑:

    <?php
    
    class ListCycler {
        private $cols, $offs, $len;
    
        // expects two or more string parameters
        public function __construct() {
            $this->offs = -1;
            $this->len = func_num_args();
            $this->cols = func_get_args();
    
            foreach($this->cols as &$c)
                $c = trim(strval($c));
        }
    
        // the object auto-increments every time it is read
        public function __toString() {
            $this->offs = ($this->offs+1) % $this->len;
            return $this->cols[ $this->offs ];
        }
    }
    ?>
    <html>
    <head>
      <style>
        ul#posts li.odd { background-color:red; }
        ul#posts li.even { background-color:white; }
      </style>
    </head>
    <body>
      <div>
        <h3>Posts:</h3>
        <ul id="posts"><?php
            $rc = new ListCycler('odd','even');
            foreach($posts as $p)
                echo "<li class='$rc'>$p</li>";
        ?></ul>
      </div>
    </body>
    </html>
    
        9
  •  2
  •   Eineki    16 年前

    只是为了好玩

    假设您可以使用css3选择器,您可以执行如下操作

    <div class="posts">
    <? foreach($posts as $post){?>
        <div>
            <?=$post?>
        </div>
    <? }?>
    </div>
    
    <style>
        div.posts div:odd{background-color:red;}
    </style>
    

    即使有了css2支持和mootools(javascript库),也可以用这个javascript替换样式。

    <script type="text/javascript">
        // obviously this script line should go in a js file in a onload (or onDomReady) function
        $$('div.posts div:odd').setStyle('background-color','red');
    </script>
    

    如果除了php a之外你什么都没有,你可以用数组简化一些代码。

    <? $isodd=array('','odd');
       $c=0;
       foreach($posts as $post){?>
        <div class="<?=$isodd[$c++%2]?>">
            <?=$post?>
        </div>
    <? }?>
    
        10
  •  1
  •   PEZ    17 年前

    虽然它足够短,但我可能会用一个清晰的名字将它包装成一个助手函数。这样,事情就更明显了,您不必在所有需要的模板中重复该逻辑。

        11
  •  1
  •   Glazius    17 年前

    如果您想在显示端进行此操作,并且熟悉或已经使用了javascript,那么jquery等库通常会 :odd 和 :even 选择器,然后可以连接到添加特定的 style properties 或者更一般地通过 adding classes .

        12
  •  1
  •   csl    17 年前

    在一侧noe,在两个值之间交替 一 和 乙 ,一个很好的循环方法是:

    x = a;
    while ( true ) {
        x = a + b - x;
    }
    

    您也可以不进行加减操作:

    x = a ^ b ^ x;
    

    哪里 ^ 是XOR操作。

    如果只想在0和1之间切换,可以执行以下操作:

    x = 0;
    while ( true ) {
        x = !x;
    }
    

    你当然可以用 X 作为颜色、CSS样式类等的索引。

        13
  •  1
  •   Sam Sun    14 年前
    function row_color($cnt,$even,$odd) { 
    echo ($cnt%2) ? "<tr bgcolor=\"$odd\">" : "<tr bgcolor=\"$even\">"; 
    } 
    

    如何使用:

    $cnt=0;
    while ($row = mysql_fetch_array ($result)) {
    row_color($cnt++,"e0e0e0","FFFFFF");
    }
    
        14
  •  1
  •   hardcoder    14 年前

    您可以滥用$global作用域来存储当前选定的类状态,请参见下面的table_row_toggle()函数。是的,我知道滥用$global scope是很肮脏的,但是,嘿,我们是来解决问题的,不是吗?:)

    在HTML中调用表行切换函数:

    <tr <? table_row_toggle(); ?>>
    

    php中的函数:

    /* function to toggle row colors in tables */
    function table_row_toggle() {
        /* check if $trclass is defined in caller */
        if(array_key_exists('trclass', $GLOBALS)) {
            $trclass = $GLOBALS['trclass'];
        }   
    
        /* toggle between row1 and row2 */
        if(!isset($trclass) || $trclass == 'row2') {
            $trclass = 'row1';
        } else {
            $trclass = 'row2';
        }   
    
        /* set $trclass in caller */
        $GLOBALS['trclass'] = $trclass;
    
        /* write the desired class to the caller */
        echo ' class="' . $trclass . '"';
    }
    
        15
  •  1
  •   user1937276    13 年前
        <?php   ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
        '<div bgcolor=" bgcolor='.$bgc.'">';
    
        16
  •  1
  •   Pete - iCalculator    11 年前

    在Vilx上定位,但速度(页面重量)总是最小的。

    <tr class="'.(($c = !$c)?'odd':'even').'">
    
        17
  •  0
  •       17 年前

    一直在用这样的东西:

    <?php
    function cycle(&$arr) {
        $arr[] = array_shift($arr);
        return end($arr); 
    }
    
    $oddEven = array('odd', 'even');
    echo cycle($oddEven)."\n";
    echo cycle($oddEven)."\n";
    echo cycle($oddEven)."\n";
    
        18
  •  0
  •   Jon Van de Riet    15 年前

    一个简单的小功能,对我很有效。

     <?php 
    class alternating_rows()
    {
        private $cycler = true;
    //------------------------------------------------------------------------------
        function rowclass($row0,$row1)
        {
            $this->cycler = !$this->cycler;//toggle the cycler
            $class=($this->cycler)?$row0:$row1;
            return $class;
        }// end function rowclass
    //------------------------------------------------------------------------------    
    
    }//end class alternating rows
    ?>
    <?php $tablerows= new alternating_rows();?>
    <table>
      <tr>
        <th scope="col">Heading 1</th>
        <th scope="col">Heading 2</th>
      </tr>
      <?php foreach ($dataset as $row){?>
      <tr class="<?php echo $tablerows->rowclass("oddrow","evenrow"); ?>">
        <td>some data</td>
        <td>some more data</td>
      </tr>
      <?php } //end foreach?>
    </table> 
    
        19
  •  0
  •   sklueh    12 年前

    在PHP中,我使用以下代码:

    function alternate($sEven = "even", $sOdd = "odd")
    {
        static $iCount;
        return ($iCount++ & 1) ? $sOdd :$sEven;
    }
    
    for($i = 0; $i< 5; $i++)
    echo alternate();
    
    
    /*output:
    
    even
    odd
    even
    odd
    even
    
    */
    

    来源: http://sklueh.de/2013/11/einfache-alternierung-mit-php/