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>'; ?>
Minä ottaisin jakojäännöksen nelosella.
Periaatteena kuitenkin, että säännöllisyys voi vaihdella 2-n välillä.
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>'; ?>
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
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>'; ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.