Najłatwiejszy sposób na zmianę kolorów napisów w PHP/HTML?


Oto mój przykład PHP. Czy ktoś może znaleźć krótszy/łatwiejszy sposób, aby to zrobić?
<? foreach($posts as $post){?>
<div class="<?=($c++%2==1)?‘odd’:NULL?>">
<?=$post?>

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

Przykłady w innych językach również byłyby interesujące.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zasadniczo nie. To jest tak proste, jak to tylko możliwe. Możesz przepisać to trochę krócej/czyściej, ale idea jest taka sama. Tak bym to napisał:
$c = true;// Let's not forget to initialize our variables, shall we?
foreach($posts as $post)
echo '<div'.(($c = !$c)?' class="odd"':'').">$post";
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz mieć mniej osadzonych PHP, świetnym sposobem na to jest użycie JavaScript.
Korzystanie z jQuery jest proste:
<script type="text/javascript">
$('div:odd').css('background-color', 'red');
</script>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Używając CSS3, możesz zrobić coś takiego:
div:nth-child(odd)
{
background-color: red
}

Ale najlepiej nie używać go przez kilka lat, jeśli naprawdę chcesz, aby użytkownicy widzieli ten kolor ...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Podobnie jak Django:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zawsze nazywam linie zebry „wiersz0” i „wiersz1” - to trochę upraszcza kod.
<?php// you should always use the full opening tag for compatibility
$i = 0;
foreach ($rows as $row) {
echo '<tr class="row' . ($i++ % 2) . '">...</tr>';
}
?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Może funkcja ze zmienną statyczną?
<?phpfunction alternate_row_color($css_class) {
static $show = true; $show = !$show; if ($show) {
return $css_class;
} else {
return NULL;
}
}?>

Następnie użyj go (na swoim przykładzie):
<?php foreach($posts as $post) { ?>
<div class="<?=alternate_row_color('odd')?>">
<?=$post?>

<?php } ?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

<?php $alt = true; foreach ($posts as $post): $alt = !$a< ?>
<div<?php echo $alt ? ' class="odd"' : ''; ?>>
<!-- Content -->

<?php endforeach ?>

Byłby to najłatwiejszy i najbardziej przejrzysty sposób na zrobienie tego.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla żartu
Zakładając, że możesz użyć selektorów CSS3, możesz zrobić coś takiego
<div class="posts">
<? foreach($posts as $post){?>
<div>
<?=$post?>

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

Nawet z obsługą CSS2 i mootools (biblioteką javascript) możesz zastąpić stylizację tym javascriptem
<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>

Jeśli nie masz nic oprócz php a, możesz nieco uprościć swój kod, używając tablicy
<? $isodd=array('','odd');
$c=0;
foreach($posts as $post){?>
<div class="<?=$isodd[$c++%2]?>">
<?=$post?>

<? }?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz ująć tę logikę w następujący sposób:
<?phpclass 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>
[b]Posts:[/b]>
<ul id="posts"><?php
$rc = new ListCycler('odd','even');
foreach($posts as $p)
echo "<li class='$rc'>$p[/*]";
?>[/list]

</body>
</html>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

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

Jak używać:
$cnt=0;
while ($row = mysql_fetch_array ($result)) {
row_color($cnt++,"e0e0e0","FFFFFF");
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jest już wystarczająco krótki, ale prawdopodobnie opakowałbym go w jakąś dobrze nazwaną funkcję pomocniczą. W ten sposób staje się bardziej oczywiste, co się dzieje i nie musisz powtarzać tej logiki we wszystkich szablonach, w których jest to potrzebne.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz to zrobić po stronie wyświetlacza i czujesz się komfortowo lub w inny sposób już używasz javascript, biblioteki takie jak jQuery często będą miały selektory

:odd
http://docs.jquery.com/Selectors/odd
i

:even
http://docs.jquery.com/Selectors/even
które można następnie podłączyć, aby dodać określone

właściwości stylu
http://docs.jquery.com/CSS/css#namevalue
lub ogólnie połącz się z CSS,

dodawanie zajęć
http://docs.jquery.com/Attributes/addClass#class
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po stronie noe naprzemiennie dwie wartości

a

i

b
, dobrym sposobem na zrobienie tego w pętli jest:
x = a;
while ( true ) {
x = a + b - x;
}

Możesz to również zrobić bez dodawania i odejmowania:
x = a ^ b ^ x;

Gdzie

^

- operacja XOR.
Jeśli chcesz po prostu zamienić 0 i 1, możesz to zrobić:
x = 0;
while ( true ) {
x = !x;
}

Możesz oczywiście użyć

x

jako indeks kolorów, klas stylów CSS i tak dalej.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

<?php ($i%2==1) ? $bgc='#999999' : $bgc='#FFFFFF'; ?>
'<div bgcolor=" bgcolor='.$bgc.'">';
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz nadużywać zakresu $ GLOBAL do przechowywania aktualnie wybranego stanu klasy, zobacz poniższą funkcję table_row_toggle (). Tak, wiem, że nadużywanie zakresu $ GLOBAL jest brudne, ale hej, jesteśmy tutaj, aby rozwiązać problem, prawda? :)
Wywołanie funkcji przełączania wierszy tabeli w HTML:
<tr <? table_row_toggle(); ?>>

Funkcja w 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 . '"';
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spot na Vilx, ale zawsze idź na minimalną prędkość (waga strony)
<tr class="'.(($c = !$c)?'odd':'even').'">
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Prosta mała funkcja, która dobrze mi pasuje.
<?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>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyłem czegoś takiego:
<?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";
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W PHP używam tego kodu:
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*/

Źródło:

http://sklueh.de/2013/11/einfa ... t-php
http://sklueh.de/2013/11/einfa ... -php/
/

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się