Вот мой пример PHP. Может ли кто-нибудь найти более короткий / более простой способ сделать это?
<? foreach($posts as $post){?> <div class="<?=($c++%2==1)?'odd':NULL?>"> <?=$post?> </div> <? }?> <style> .odd{background-color:red;} </style>
Примерами других языков было бы интересно посмотреть также.
По существу – нет. Это примерно так же просто, как и получается. Вы можете переписать его немного короче / чище, но идея будет такой же. Вот как я это написал:
$c = true; // Let's not forget to initialize our variables, shall we? foreach($posts as $post) echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
Если вы хотите иметь меньше встроенного PHP, отличный способ сделать это через JavaScript.
Используя jQuery, это просто:
<script type="text/javascript"> $('div:odd').css('background-color', 'red'); </script>
Используя CSS3, вы можете сделать что-то вроде этого:
div:nth-child(odd) { background-color: red }
Но лучше не использовать это в течение нескольких лет, если вы действительно хотите, чтобы ваши пользователи увидели цвет …
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 %}
Я всегда называю мои строки зебры «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>'; } ?>
Может быть, функция со статической переменной?
<?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 } ?>
Вы можете инкапсулировать логику следующим образом:
<?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>
Просто для удовольствия
Предполагая, что вы можете использовать селектор CSS3, вы можете сделать что-то вроде
<div class="posts"> <? foreach($posts as $post){?> <div> <?=$post?> </div> <? }?> </div> <style> div.posts div:odd{background-color:red;} </style>
Даже с поддержкой CSS2 и mootools (javascript library) вы можете заменить стиль на этот 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> <? }?>
Это достаточно коротко, но я бы, вероятно, включил его в какую-то вспомогательную функцию с четким именем. Таким образом, более очевидно, что происходит, и вам не придется повторять эту логику во всех шаблонах, где вам это нужно.
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?> <div<?php echo $alt ? ' class="odd"' : ''; ?>> <!-- Content --> </div> <?php endforeach ?>
Было бы самым простым и ясным способом сделать это.
Если вы хотите сделать это на конце дисплея, и вам удобнее или иначе уже использовать javascript, библиотеки, такие как jQuery, часто будут иметь : нечетные и даже селекторные элементы, которые затем можно подключить к добавлению определенных свойств стиля или подключиться к CSS в целом путем добавления классов .
На стороне noe, чтобы чередовать два значения a и b , хороший способ сделать это в цикле:
x = a; while ( true ) { x = a + b - x; }
Вы также можете делать это без сложения и вычитания:
x = a ^ b ^ x;
где ^ – операция XOR.
Если вы просто хотите чередовать между 0 и 1, вы можете сделать это:
x = 0; while ( true ) { x = !x; }
Разумеется, вы можете использовать x как индекс цветов, классы стиля CSS и так далее.
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"); }
Вы можете использовать глобальную область $ 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 . '"'; }
<?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?> '<div bgcolor=" bgcolor='.$bgc.'">';
Пятно на Vilx, но всегда идет минимально для скорости (вес страницы)
<tr class="'.(($c = !$c)?'odd':'even').'">
Использую что-то вроде этого:
<?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";
Простая небольшая функция, которая хорошо работает для меня.
<?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>
В 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/