Самый простой способ чередовать цвета строк в PHP/HTML?
Вот пример моего PHP. Может ли кто-нибудь найти более короткий/более простой способ сделать это?
<? foreach($posts as $post){?>
<div class="<?=($c++%2==1)?‘odd’:NULL?>">
<?=$post?>
</div>
<? }?>
<style>
.odd{background-color:red;}
</style>
Примерами других языков было бы интересно увидеть также.
Ответы
Ответ 1
В принципе - нет. Это так же легко, как и получается. Вы можете переписать его немного короче/чище, но идея будет такой же. Вот как я это написал:
$c = true; // Let not forget to initialize our variables, shall we?
foreach($posts as $post)
echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
Ответ 2
Если вы хотите иметь меньше встроенного PHP, отличный способ сделать это через JavaScript.
Используя jQuery, это просто:
<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
Ответ 3
С помощью CSS3 вы можете сделать что-то вроде этого:
div:nth-child(odd)
{
background-color: red
}
Но лучше не использовать это в течение нескольких лет, если вы действительно хотите, чтобы ваши пользователи увидели цвет...
Ответ 4
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
Я всегда называю мои строки зебры "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
Может быть, функция со статической переменной?
<?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
Просто для удовольствия
Предполагая, что вы можете использовать селектор 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>
<? }?>
Ответ 8
Вы можете инкапсулировать логику следующим образом:
<?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
Он достаточно короткий, как есть, но я бы, вероятно, привязал его к некоторой вспомогательной функции с ясным именем. Таким образом, более очевидно, что происходит, и вам не придется повторять эту логику во всех шаблонах, где вам это нужно.
Ответ 10
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
<!-- Content -->
</div>
<?php endforeach ?>
Был бы самый простой и понятный способ сделать это.
Ответ 11
Если вы хотите сделать это на конце дисплея и вам удобнее или уже с помощью javascript, библиотеки, такие как jQuery, часто будут иметь : нечетный и : даже селекторов, которые затем можно подключить к добавлению определенного свойства стиля или подключение к CSS в целом добавление классов.
Ответ 12
На стороне 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 и т.д.
Ответ 13
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
Вы можете использовать область $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
<?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
'<div bgcolor=" bgcolor='.$bgc.'">';
Ответ 16
Пятно на Vilx, но всегда нужно минимальное для скорости (вес страницы)
<tr class="'.(($c = !$c)?'odd':'even').'">
Ответ 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
Простая небольшая функция, которая хорошо работает для меня.
<?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
В 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/