wake-up-neo.com

Der einfachste Weg, um Zeilenfarben in PHP/HTML zu wechseln?

Hier ist ein PHP Beispiel von mir. Kann jemand einen kürzeren/einfacheren Weg finden, um dies zu tun?

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

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

Beispiele in anderen Sprachen würden auch Spaß machen.

25
thrashr888

Grundsätzlich - nein. Das ist so einfach wie es nur geht. Sie könnten es etwas kürzer/sauberer schreiben, aber die Idee wird dieselbe sein. So würde ich es schreiben:

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

Wenn Sie weniger Inline-PHP haben möchten, können Sie dies über JavaScript tun.

Mit jQuery ist es einfach:

<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
19
Max

Mit CSS3 können Sie so etwas tun:

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

Aber verwenden Sie das besser nicht für ein paar Jahre, wenn Sie wirklich möchten, dass Ihre Benutzer die Farbe sehen ...

11
Ole Helgesen

Smarty hat es eingebaut:

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

Django auch:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
8
Gerald Kaszuba

ich nenne meine Zebrazeilen immer "row0" und "row1" - das macht den Code etwas einfacher.

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

Vielleicht eine Funktion mit einer statischen Variablen?

<?php

function alternate_row_color($css_class) {
    static $show = true;

    $show = !$show;

    if ($show) {
        return $css_class;
    } else {
        return NULL;
    }
}

?>

Dann verwenden Sie es (anhand Ihres Beispiels):

<?php foreach($posts as $post) { ?>
    <div class="<?=alternate_row_color('odd')?>">
        <?=$post?>
    </div>
<?php } ?>
3
Jeremy Ruten

Sie können die Logik wie folgt kapseln:

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

Wäre der einfachste und klarste Weg, es zu tun.

2
navitronic

Nur zum Spaß 

Angenommen, Sie können CSS3-Selektoren verwenden

<div class="posts">
<? foreach($posts as $post){?>
    <div>
        <?=$post?>
    </div>
<? }?>
</div>

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

Selbst mit CSS2-Unterstützung und Mootools (Javascript-Bibliothek) können Sie den Stil durch dieses Javascript ersetzen 

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

Wenn Sie nichts anderes als PHP haben, können Sie einen Bitcode mit einem Array vereinfachen

<? $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

Auf einer Seite noe, um zwischen zwei Werten a und b zu wechseln, ist dies eine nette Art, es in einer Schleife zu tun:

x = a;
while ( true ) {
    x = a + b - x;
}

Sie können dies auch ohne Addition und Subtraktion tun:

x = a ^ b ^ x;

dabei ist ^ die Operation XOR.

Wenn Sie nur zwischen 0 und 1 wechseln möchten, können Sie Folgendes tun:

x = 0;
while ( true ) {
    x = !x;
}

Sie können natürlich x als Index für Farben, CSS-Stilklassen usw. verwenden.

1
csl

Es ist kurz genug, wie es ist, aber ich würde es wahrscheinlich in eine Hilfsfunktion mit einem klaren Namen einbinden. Auf diese Weise wird deutlich, was los ist, und Sie müssen diese Logik nicht in allen Vorlagen wiederholen, in denen Sie sie benötigen.

1
PEZ
function row_color($cnt,$even,$odd) { 
echo ($cnt%2) ? "<tr bgcolor=\"$odd\">" : "<tr bgcolor=\"$even\">"; 
} 

Wie benutzt man:

$cnt=0;
while ($row = mysql_fetch_array ($result)) {
row_color($cnt++,"e0e0e0","FFFFFF");
}
1
Sam Sun

Wenn Sie es am Ende des Displays tun möchten und mit Javascript vertraut sind oder dieses bereits anderweitig verwenden, haben Bibliotheken wie jQuery häufig die Optionen : odd und : even , die Sie dann anhängen können bis hin zum Hinzufügen bestimmter Eigenschaften im Stil oder allgemeinerem Einhaken in CSS durch Hinzufügen von Klassen .

1
Glazius

Spot auf Vilx, aber gehen Sie immer auf Geschwindigkeit (Seitengewicht) 

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

Sie können den Geltungsbereich $ GLOBAL zum Speichern des aktuell ausgewählten Klassenstatus verwenden. Weitere Informationen finden Sie unter der Funktion table_row_toggle (). Ja, ich weiß, es ist schmutzig, den $ GLOBAL-Bereich zu missbrauchen, aber hey, wir sind hier, um Probleme zu beheben, oder? :)

Aufrufen der Tabellenzeilenumschaltfunktion in HTML:

<tr <? table_row_toggle(); ?>>

Die Funktion in 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

Eine einfache kleine Funktion, die für mich gut funktioniert.

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

Ich habe so etwas benutzt:

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

In PHP verwende ich diesen 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

*/

Quelle: http://sklueh.de/2013/11/einfache-alternierung-mit-php/

0
sklueh