Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Rivien värivaihto

pht [20.10.2004 10:16:00]

#

Usein näkee even-odd tyyppisen rivien värivaihdon tyyliin:

$color = $row_number % 2 == 0 ? '#123456' : '#990000';

Mutta miten olette ratkaisseet ongelman, kun rivit halutaan värittää useammilla väreillä säännöllisesti sanotaan vaikkapa 4 rivin jaksoin?

<?php
$colors = array( '123456', '990000', '003399', 'ffaa55' );
$num_colors = count( $colors );
//
function getColor( $row_number )
{
	global $colors, $num_colors;
	$leftover = ( $row_number / $num_colors ) - floor( ( $row_number / $num_colors ) );
	$ind = $leftover == 0 ? $num_colors : round( $leftover * $num_colors );
	return $colors[$ind-1];
}

echo '<table width="300" border="0" cellpadding="0" cellspacing="1">';
for( $i=1; $i<60; $i++ ) {
	echo '<tr bgcolor="#' . getColor( $i ) . '" style="color:#f8f8f8"><td width="20">' . $i . '</td><td>' . getColor( $i ) . '</td></tr>';
}
echo '</table>';
?>

Blaze [20.10.2004 10:44:30]

#

Minä ottaisin jakojäännöksen nelosella.

$temp = $i % 3;
if($temp == 0) {
  $väri = ekaväri;
} else if($temp == 1) {
  $väri = tokaväri;
} else if ($temp == 2) {
  $väri = kolmasväri;
} else {
  $väri = neljäsväri;
}

pht [20.10.2004 11:01:19]

#

Periaatteena kuitenkin, että säännöllisyys voi vaihdella 2-n välillä.

Antti Laaksonen [20.10.2004 15:19:45]

#

Jakojäännös kelpaa silti. Koodi kutistuu silloin tämmöiseksi, ja erillinen funktio ei ole tarpeen.

<?php
$colors = array( '123456', '990000', '003399', 'ffaa55' );
$num_colors = count( $colors );

echo '<table width="300" border="0" cellpadding="0" cellspacing="1">';
for( $i=1; $i<60; $i++ ) {
    echo '<tr bgcolor="#' . $colors[$i % $num_colors] . '" style="color:#f8f8f8"><td width="20">' . $i . '</td><td>' . getColor( $i ) . '</td></tr>';
}
echo '</table>';
?>

pht [20.10.2004 16:03:54]

#

Tuollaista minä hain. Ainoo muoto seikka siinä on, että colors taulukon ensimmäinen väri tulee viimeiseksi, toinen ensimmäiseksi jne... eli koko väripaletti siirtyy hiukan. Vaaditaanko funktio tuon järjestyksen ylläpitämiseksi kuitenkin?

Ongelmakohta on, että jakojäännös (indexluku) 4 % 4 = 0 vaikka index luku pitäisi olla 3.

Yks vaihtoehto on muuttaa lauseke:

$colors[$i % $num_colors] ->

$i % $num_colors == 0 ? $colors[$num_colors-1] : $colors[($i % $num_colors)-1];

Vai tekeekö float jakojäännösluku tepposensa tuossa tapauksessa?

Jokatapauksessa koodi sai hyvän parannusehdotuksen, kiitoksia Antti

pht [20.10.2004 16:11:09]

#

Ehkä jokin tämäntyylinen?

<?php
$colors = array( '123456', '990000', '003399', 'ffaa55' );
$num_colors = count( $colors );
function getInd( $i, $num_colors )
{
	return $i % $num_colors == 0 ? $num_colors-1 : ( $i % $num_colors )-1;
}
echo '<table width="300" border="0" cellpadding="0" cellspacing="1">';
for( $i=1; $i<21; $i++ ) {
    echo '<tr bgcolor="#' . $colors[getInd( $i, $num_colors )] . '" style="color:#f8f8f8"><td width="20">' . $i . '</td><td>' . getInd( $i, $num_colors ) . '</td></tr>';
}
echo '</table>';
?>

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta