[PHP]HSV(HSB)をRGBに変換する

以前 RGB を HSV に変換するプログラムを作りましたが、 今回はその逆で、HSV を RGB に変換してみます。

function hsv2rgb($h, $s, $v){
	if ( $s == 0 ) {
		$r = $v * 255;
		$g = $v * 255;
		$b = $v * 255;
	} else {
		$h = ($h >= 0) ? $h % 360 / 360 : $h % 360 / 360 + 1;
		$var_h = $h * 6;
		$i = (int)$var_h;
		$f = $var_h - $i;
		
		$p = $v * ( 1 - $s );
		$q = $v * ( 1 - $s * $f );
		$t = $v * ( 1 - $s * ( 1 - $f ) );
		
		switch($i){
			case 0:
				$var_r = $v;
				$var_g = $t;
				$var_b = $p;
				break;
			case 1:
				$var_r = $q;
				$var_g = $v;
				$var_b = $p;
				break;
			case 2:
				$var_r = $p;
				$var_g = $v;
				$var_b = $t;
				break;
			case 3:
				$var_r = $p;
				$var_g = $q;
				$var_b = $v;
				break;
			case 4:
				$var_r = $t;
				$var_g = $p;
				$var_b = $v;
				break;
			default:
				$var_r = $v;
				$var_g = $p;
				$var_b = $q;
		}
		$r = $var_r * 255;
		$g = $var_g * 255;
		$b = $var_b * 255;	
	}
	return array($r, $g, $b);
}

引数は色相、彩度、明度の順で渡します。
色相(H)は 0 ~ 360 を指定し、彩度(S)・明度(V)は 0 ~ 1 の小数で指定します。
結果は RGB 値( 0 ~ 255 )の配列で返されます。

参考: HSV色空間 – Wikipedia

[PHP]配列から空の要素を取り除いて詰める

配列の中から true で無いものを取り除くには第 2 引数を省略した array_filter() を使えばできます。
ただし、数値の 0 まで消されてしまったりするので、条件を細かく指定する場合、無名関数を作るとコンパクトに収まります。

<?php
$arr = array('test', '', false, array(), 0, null, 'sample');
$arr = array_filter($arr, function($value) {return (!empty($value) || $value === 0);} );

結果

Array ( [0] => test [4] => 0 [6] => sample ) 

PHP 5.3 から無名関数(クロージャ)が使えるようになりましたが、それより古い場合は create_function() を使えば同様の処理ができます。

$arr = array_filter($arr, create_function('$value', 'return (!empty($value) || $value === 0);') );

要素が取り除かれても添字は保持されているので、再度詰めて振り直すには array_merge($arr) を使います。
この場合添字が文字列の場合保持され、数値の場合は振り直されます。
連想配列を無視して振り直す場合は array_values() でも可能です。

[PHP]var_dump()、print_r()などの内容をファイルに保存する

配列変数の内容を確認するために var_dump() や print_r() は便利ですが、cron で動作させるプログラムが正常に動作しているか調べたいときなど、ブラウザ上に表示して確認できないことは多いと思います。

var_dump() などの内容をファイルとして保存する場合、ob_start() を使って出力のバッファリングをすると簡単に出来ます。

<?php
$arr = array('test', 'sample');

ob_start();
var_dump($arr);
$out = ob_get_contents();
ob_end_clean();

file_put_contents("sample.txt", $out);

ob_start() と ob_end_clean() で挟まれた部分は画面上には出力されず、バッファに格納されます。
その内容を取り出すには ob_get_contents() を使います。