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.
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>";
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>
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 ...
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 %}
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>';
}
?>
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 } ?>
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>
<?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.
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>
<? }?>
<?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
'<div bgcolor=" bgcolor='.$bgc.'">';
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.
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.
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");
}
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 .
Spot auf Vilx, aber gehen Sie immer auf Geschwindigkeit (Seitengewicht)
<tr class="'.(($c = !$c)?'odd':'even').'">
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 . '"';
}
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>
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";
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/