|
Pers.narod.ru. PHP. Статьи. Таблица безопасных цветов Netscape на PHP |
Рассматриваемая задача состояла в том, чтобы сделать на PHP циклы, которые программно можно менять местами, то есть, чтобы
for ($i=0; $i<$n; $i++)
for ($j=0; $j<$m; $j++)
for ($k=0; $k<$l; $k++) {
echo "<br>$i,$j,$k";
}
могло выполняться и как
for ($j=0; $j<$m; $j++)
for ($i=0; $i<$n; $i++)
for ($k=0; $k<$l; $k++) {
echo "<br>$i,$j,$k";
}
и так далее во всех шести вариантах перестановок. Самое очевидное решение - задать в какой-то строке нужный порядок циклов и использовать переменную переменных, как-то так:
$n=$m=$l=5;
$order='kji';
$i1=substr($order,0,1);
$j1=substr($order,1,1);
$k1=substr($order,2,1);
for ($$i1=0; $$i1<$n; $$i1++)
for ($$j1=0; $$j1<$m; $$j1++)
for ($$k1=0; $$k1<$l; $$k1++) {
echo "<br>$i,$j,$k";
}
Этим следовало и ограничиться, но мне вдруг вспомнилась цветовая палитра Netscape, она же безопасные цвета, ведь если их все рисовать, тоже понадобится тройной цикл для 3 цветовых компонент! Так что пример получился гораздо более громоздким и за полчаса перерос в небольшой скрипт.
Netscape Color Palette Map - скрипт в работе
Скачать исходники в архиве ZIP (2 Кб)
Параметр rgb, передаваемый только через URL (методом GET), задаёт порядок циклов по красной, зелёной и синей цветовым компонентам, он может принимать
значения rgb, rbg, brg, grb, bgr и gbr :)
Вот как можно перевести интенсивности красного, зелёного и синего, заданные десятичными числами, в строку формата #RRGGBB:
function colorcode ($r,$g,$b) {
//Десятичные интенсивности красного, зелёного и синего - в цвет #RRGGBB
return '#'.($r<10?'0':'').strtoupper(dechex($r)).($g<10?'0':'').
strtoupper(dechex($g)).($b<10?'0':'').strtoupper(dechex($b));
}
Эта функция в скрипте не пригодилась, так как у нас
существенен порядок циклов, передаваемый параметром с именем $rgb. Например, если $rgb='bgr', то при
выводе строк таблицы быстрее всего меняется
красный цвет, затем зелёный, а в последнюю очередь синий. Неуместны теперь и параметры $r,$g,$b, заменим их на текущие
счётчики тройного цикла $i,$j,$k:
function colorcode ($i,$j,$k,$rgb) {
//Используем другую функцию, чтобы можно было выводить цвета в разном порядке
$cols = array ('r'=>'00','g'=>'00','b'=>'00');
$vars = array ($i, $j, $k);
for ($n=0; $n<3; $n++) {
$c=substr($rgb,$n,1);
$cols[$c]=($vars[$n]<10?'0':'').strtoupper(dechex($vars[$n]));
}
return '#'.implode('',$cols);
}
Второй нюанс - текст в цветной ячейке таблицы выводится шрифтом, противоположным по коду цвету фона ячейки. Первое пришедшее в голову решение для инверсии цвета, как оказалось, не работает!
function invertcode ($c) {
return str_replace (
array ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'),
array ('F','E','D','C','B','A','9','8','7','6','5','4','3','2','1','0'),
$c);
}
//Эта версия неверна #6633FF => #663300
//Если поменять массивы местами, будет #6633FF => #99CCFF
Похоже, str_replace проходит по массивам поиска и замены неоднократно?
А вот через strtr всё сработало нормально:
function invertcode ($c) {
//Правильная версия функции инверсии кода цвета #RRGGBB
// #6633FF => #99CC00
return strtr ($c,array (
'F'=>'0', 'E'=>'1', 'D'=>'2', 'C'=>'3',
'B'=>'4', 'A'=>'5', '9'=>'6', '8'=>'7',
'7'=>'8', '6'=>'9', '5'=>'A', '4'=>'B',
'3'=>'C', '2'=>'D', '1'=>'E', '0'=>'F'));
}
Ну и сама функция построения цветовой таблицы с переменным порядком цветов получилась вот такая:
function colortab ($rgb) {
echo '<div align="center"><table align="center" cellpadding="2" cellspacing="0"><tr>'."\n";
$n=$r=0;
for ($i=0; $i<257; $i+=51)
for ($j=0; $j<257; $j+=51)
for ($k=0; $k<257; $k+=51)
{
$c=colorcode($i,$j,$k,$rgb);
echo '<td bgcolor="'.$c.'" align="center" valign="middle"><font color="'.invertcode($c).'">'.$c.'</font></td>'."\n";
$n++;
if ($n and !($n%6)) echo '<td width="6"></td>'."\n";
if ($n and !($n%12)) {
echo '</tr><tr>'."\n";
$r++;
if ($r and !($r%6)) echo '<tr><td colspan="13" height="6"></td></tr>';
}
}
echo '</tr></table></div>'."\n";
}
Штучка бесполезная, но пусть будет.
|
|