La forma más fácil de alternar colores de filas en PHP / HTML?

Aquí hay un ejemplo de PHP mío. ¿Alguien puede encontrar una manera más corta / más fácil de hacer esto?

 <div class="">  
.odd{background-color:red;}

También sería divertido ver ejemplos en otros idiomas.

Fundamentalmente – no. Eso es lo más fácil posible. Puede volver a escribirlo un poco más corto / más limpio, pero la idea será la misma. Así es como lo escribiría:

 $c = true; // Let's not forget to initialize our variables, shall we? foreach($posts as $post) echo '
$post
";

Si desea tener menos PHP en línea, una buena forma de hacerlo es a través de JavaScript.

Usando jQuery, es simplemente:

  

Usando CSS3 puedes hacer algo como esto:

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

Pero mejor no usar eso por unos años si realmente quieres que tus usuarios vean el color …

Smarty lo tiene incorporado:

 {section name=rows loop=$data}  {$data[rows]}  {/section} 

Lo mismo ocurre con Django:

 {% for o in some_list %}  ...  {% endfor %} 

siempre llamo a mis filas de cebra “row0” y “row1” – esto hace que el código sea un poco más simple.

 < ?php // you should always use the full opening tag for compatibility $i = 0; foreach ($rows as $row) { echo '...'; } ?> 

Tal vez una función con una variable estática?

 < ?php function alternate_row_color($css_class) { static $show = true; $show = !$show; if ($show) { return $css_class; } else { return NULL; } } ?> 

Luego para usarlo (usando tu ejemplo):

 < ?php foreach($posts as $post) { ?> 
< ?=$post?>
< ?php } ?>

Puede encapsular la lógica de la siguiente manera:

 < ?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 ]; } } ?>      

Posts:

    < ?php $rc = new ListCycler('odd','even'); foreach($posts as $p) echo "
  • $p"; ?>

Solo por diversión

Asumiendo que puede usar selectores de CSS3, puede hacer algo como

 
< ? foreach($posts as $post){?>
< ?=$post?>
< ? }?>

Incluso con soporte de CSS2 y mootools (biblioteca de JavaScript) puede sustituir el estilo con este javascript

  

Si no tiene nada más que php a, puede simplificar un poco su código usando una matriz

 < ? $isodd=array('','odd'); $c=0; foreach($posts as $post){?> 
< ?=$post?>
< ? }?>

Es lo suficientemente corto como lo es, pero probablemente lo envolvería en alguna función auxiliar con un nombre claro. De esta forma, es más obvio lo que está sucediendo y no tendrá que repetir esa lógica en todas las plantillas donde lo necesite.

 < ?php $alt = true; foreach ($posts as $post): $alt = !$alt; ?> 
>
< ?php endforeach ?>

Sería la forma más simple y clara de hacerlo.

Si desea hacerlo en la pantalla y se siente cómodo o ya utiliza javascript, las bibliotecas como jQuery a menudo tendrán : impar e incluso selectores, que luego puede conectar para agregar propiedades de estilo específicas o enganchar en CSS de manera más general agregando clases .

En un lado noe, para alternar entre dos valores a y b , una buena manera de hacerlo en un bucle es esta:

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

También puedes hacer esto sin sums y restas:

 x = a ^ b ^ x; 

donde ^ es la operación XOR.

Si solo quiere alternar entre 0 y 1, puede hacer esto:

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

Por supuesto, puede usar x como un índice de colores, clases de estilo CSS, etc.

 function row_color($cnt,$even,$odd) { echo ($cnt%2) ? "" : ""; } 

Cómo utilizar:

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

Puede abusar del scope $ GLOBAL para almacenar el estado de clase seleccionado actual, consulte la función table_row_toggle () a continuación. Sí, sé que es sucio abusar del scope de $ GLOBAL, pero hey, estamos aquí para solucionar los problemas, ¿no es así? 🙂

Llamar a la función de alternancia de filas de la tabla en HTML:

 > 

La función 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 . '"'; } 
  < ?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?> '
';

Mancha en Vilx pero, siempre es mínimo para la velocidad (peso de la página)

  

He estado usando algo como esto:

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

Una pequeña función simple que funciona bien para mí.

  < ?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();?>  < ?php foreach ($dataset as $row){?> ">  < ?php } //end foreach?> 
Heading 1 Heading 2
some data some more data

En PHP estoy usando este código:

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

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