Цветные циклы...
Если Вы когда нибудь в качестве мелкого шныря ночальнега распределяли учебную производственную нагрузку, то знаете, что это такое. Поскольку в последние годы речи о том, чтоб заработать больше, не идёт, нужно сразу ставить правильную цель - как потерять меньше, ну или хотя бы как меньше работать за те же деньги. Потратив пару дней на решение заведомо некорректной из-за огромного количества
бездельников антагонистических противоречий задачу,
я всё же успевал в промежутках вести курсы по 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 - скрипт в работе
Скачать исходники можно на странице скрипта
Параметр 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"; }
Штучка бесполезная, но пусть будет.
В общем, на этом рабочую неделю пора заканчивать, надо и о выпивке доме ребёнке подумать.
А то мой рабочий день в пн-вт длился часов по 12, но ведь гордиться тут нечем - дурак тем и отличается,
что всё время работает, так что думать ему некогда.
25.04.2012, 11:52 [11513 просмотров]