Voici un exemple de PHP. Quelqu'un peut-il trouver un moyen plus court/plus simple de le faire?
<? foreach($posts as $post){?>
<div class="<?=($c++%2==1)?‘odd’:NULL?>">
<?=$post?>
</div>
<? }?>
<style>
.odd{background-color:red;}
</style>
Il serait également amusant de voir des exemples dans d’autres langues.
Fondamentalement - non. C'est à peu près aussi facile que cela devient. Vous pouvez le réécrire un peu plus court/plus net, mais l'idée sera la même. Voici comment je l'écrirais:
$c = true; // Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
echo '<div'.(($c = !$c)?' class="odd"':'').">$post</div>";
Si vous souhaitez avoir moins de PHP en ligne, utilisez JavaScript.
Avec jQuery, c'est simplement:
<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
En utilisant CSS3, vous pouvez faire quelque chose comme ceci:
div:nth-child(odd)
{
background-color: red
}
Mais mieux vaut ne pas l'utiliser pendant quelques années si vous voulez que vos utilisateurs voient la couleur ...
Smarty l'a intégré:
{section name=rows loop=$data}
<tr class="{cycle values="odd,even"}">
<td>{$data[rows]}</td>
</tr>
{/section}
Django aussi:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
je nomme toujours mes lignes de zèbres "row0" et "row1" - cela rend le code un peu plus simple.
<?php // you should always use the full opening tag for compatibility
$i = 0;
foreach ($rows as $row) {
echo '<tr class="row' . ($i++ % 2) . '">...</tr>';
}
?>
Peut-être une fonction avec une variable statique?
<?php
function alternate_row_color($css_class) {
static $show = true;
$show = !$show;
if ($show) {
return $css_class;
} else {
return NULL;
}
}
?>
Ensuite, pour l'utiliser (en utilisant votre exemple):
<?php foreach($posts as $post) { ?>
<div class="<?=alternate_row_color('odd')?>">
<?=$post?>
</div>
<?php } ?>
Vous pouvez encapsuler la logique comme suit:
<?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>
<?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
<!-- Content -->
</div>
<?php endforeach ?>
Serait le moyen le plus simple et le plus clair de le faire.
Juste pour le fun
En supposant que vous puissiez utiliser les sélecteurs CSS3, vous pouvez faire quelque chose comme:
<div class="posts">
<? foreach($posts as $post){?>
<div>
<?=$post?>
</div>
<? }?>
</div>
<style>
div.posts div:odd{background-color:red;}
</style>
Même avec le support CSS2 et mootools (bibliothèque javascript), vous pouvez remplacer le style par ce 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>
Si vous n'avez rien d'autre que php, vous pouvez simplifier un peu le code en utilisant un tableau
<? $isodd=array('','odd');
$c=0;
foreach($posts as $post){?>
<div class="<?=$isodd[$c++%2]?>">
<?=$post?>
</div>
<? }?>
<?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
'<div bgcolor=" bgcolor='.$bgc.'">';
Côté noe, pour alterner entre deux valeurs a et b , une bonne façon de le faire en boucle est la suivante:
x = a;
while ( true ) {
x = a + b - x;
}
Vous pouvez également le faire sans addition ni soustraction:
x = a ^ b ^ x;
où ^ est l'opération XOR.
Si vous voulez juste alterner entre 0 et 1, vous pouvez faire ceci:
x = 0;
while ( true ) {
x = !x;
}
Vous pouvez bien sûr utiliser x comme index de couleurs, de classes de style CSS, etc.
C'est assez court tel quel, mais je l'insérerais probablement dans une fonction d'aide avec un nom clair. Ainsi, ce qui se passe est plus évident et vous n’aurez pas à répéter cette logique dans tous les modèles lorsque vous en avez besoin.
function row_color($cnt,$even,$odd) {
echo ($cnt%2) ? "<tr bgcolor=\"$odd\">" : "<tr bgcolor=\"$even\">";
}
Comment utiliser:
$cnt=0;
while ($row = mysql_fetch_array ($result)) {
row_color($cnt++,"e0e0e0","FFFFFF");
}
Si vous voulez le faire sur l’affichage et que vous utilisez javascript ou que vous utilisez déjà javascript, les bibliothèques comme jQuery auront souvent les sélecteurs : odd et : even , que vous pourrez ensuite associer pour ajouter propriétés de style ou plus généralement dans CSS par ajout de classes .
Spot sur Vilx mais, allez toujours minime pour la vitesse (poids de page)
<tr class="'.(($c = !$c)?'odd':'even').'">
Vous pouvez abuser de la portée de $ GLOBAL pour stocker l'état de la classe actuellement sélectionnée, voir ci-dessous la fonction table_row_toggle (). Oui, je sais que c’est sale d’abuser de la portée de $ GLOBAL, mais bon, on est là pour régler des problèmes, non? :)
Appel de la fonction de bascule de ligne de tableau en HTML:
<tr <? table_row_toggle(); ?>>
La fonction en 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 . '"';
}
Une petite fonction simple qui fonctionne bien pour moi.
<?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>
Utilisé quelque chose comme ça:
<?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";
Dans PHP, j'utilise ce code:
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
*/
Source: http://sklueh.de/2013/11/einfache-alternierung-mit-php/