web-dev-qa-db-fra.com

Le moyen le plus simple d'alterner les couleurs des lignes en PHP/HTML?

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.

25
thrashr888

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>";
46
Vilx-

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>
19
Max

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 ...

11
Ole Helgesen

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 %}
8
Gerald Kaszuba

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>';
} 
?>
5
nickf

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 } ?>
3
Jeremy Ruten

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>
2
Hugh Bothwell
<?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.

2
navitronic

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>
<? }?>
2
Eineki
    <?php   ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
    '<div bgcolor=" bgcolor='.$bgc.'">';
1
user1937276

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;

^ 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.

1
csl

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.

1
PEZ
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");
}
1
Sam Sun

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 .

1
Glazius

Spot sur Vilx mais, allez toujours minime pour la vitesse (poids de page) 

<tr class="'.(($c = !$c)?'odd':'even').'">
1

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 . '"';
}
1
hardcoder

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> 
0
Jon Van de Riet

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";
0

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/

0
sklueh