Самый простой способ чередовать цвета строк в PHP / HTML? - PullRequest
26 голосов
/ 30 декабря 2008

Вот мой пример PHP. Может кто-нибудь найти более короткий / простой способ сделать это?

<? foreach($posts as $post){?>
    <div class="<?=($c++%2==1)?‘odd’:NULL?>">
        <?=$post?>
    </div>
<? }?>

<style>
    .odd{background-color:red;}
</style>

Примеры на других языках также было бы интересно посмотреть.

Ответы [ 19 ]

46 голосов
/ 30 декабря 2008

Принципиально - нет. Это так просто, как только может. Вы могли бы переписать это немного короче / чище, но идея будет той же. Вот как бы я это написал:

$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
    echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
19 голосов
/ 30 декабря 2008

Если вы хотите иметь меньше встроенного PHP, отличный способ сделать это с помощью JavaScript.

Используя jQuery, это просто:

<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
11 голосов
/ 30 декабря 2008

Используя CSS3, вы можете сделать что-то вроде этого:

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

Но лучше не использовать это в течение нескольких лет, если вы действительно хотите, чтобы ваши пользователи видели цвет ...

8 голосов
/ 30 декабря 2008

Smarty имеет его встроенный:

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

Так же, как и Джанго:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
5 голосов
/ 31 декабря 2008

я всегда называю свои строки зебры "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>';
} 
?>
3 голосов
/ 30 декабря 2008

Может быть функция со статической переменной?

<?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 } ?>
2 голосов
/ 30 декабря 2008
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
    <!-- Content --> 
</div>  
<?php endforeach ?>

Был бы самый простой и понятный способ сделать это.

2 голосов
/ 30 декабря 2008

просто для удовольствия

Предполагая, что вы можете использовать селекторы 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 it, вы можете немного упростить свой код, используя массив

<? $isodd=array('','odd');
   $c=0;
   foreach($posts as $post){?>
    <div class="<?=$isodd[$c++%2]?>">
        <?=$post?>
    </div>
<? }?>
2 голосов
/ 30 декабря 2008

Вы можете инкапсулировать логику следующим образом:

<?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>
1 голос
/ 29 мая 2015

Пятно на Вилксе, но всегда скорость минимальна (вес страницы)

<tr class="'.(($c = !$c)?'odd':'even').'">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...