[PHP]switch()は通常では厳密に型を比較しない

プログラミングである変数の値によって処理を分岐する際、switch() を使うのは珍しいことではありませんが、PHP で switch() を使うには注意が必要です。

というのも、PHPでの比較は「===」ではなく「==」による緩やかな比較であるため、それを考慮していないと狙いと違う動作をすることになります。

次のサンプルは文字列型の変数 $sample を空文字で初期化し、switch() で処理を分けています。
型を区別していれば「Blank」の文字が出力されるのですが実際には「null」が出力されます。

<?php
$sample = '';

switch($sample){
	case null:
		echo 'null';
		break;
	case 0:
		echo '0';
		break;
	case '':
		echo 'Blank';
		break;
	default:
		echo 'Default';
		break;
}

もし型を厳密に比較するのであれば if による分岐を使うか、次のようにします。

<?php
$sample = '';

switch(true){
	case $sample === null:
		echo 'null';
		break;
	case $sample === 0:
		echo '0';
		break;
	case $sample === '':
		echo 'Blank';
		break;
	default:
		echo 'Default';
		break;
}

狙った動作が実現できるとはいえ本流から外れた使い方なので、そもそも厳密な型比較が必要なケースで switch() を使うこと自体正しくないのかもしれません。

参考サイト: http://php.net/manual/ja/control-structures.switch.php

[PHP]インスタンスが特定クラスのオブジェクトであるか調べる(型演算子)

仮にクラス Foo と Bar があったとして、インスタンスがどちらのクラスオブジェクトであるかを判定して処理を分けたい場合、instanceof を使うことによって型を比較することができます。

下記サンプルでは関数 sample() にクラス Bar か Foo を渡すと、それぞれに合わせた処理をして返すというものです。

<?php
class Foo {}
class Bar {}

function sample($obj){
	if($obj instanceof Foo){
		return "foo";
	} else if($obj instanceof Bar){
		return "bar";
	} else {
		return "";
	}
}

$foo = new Foo();
$bar = new Bar();
echo sample($bar);

出力結果:

bar

$foo を渡した場合は「foo」という文字列が返ります。
instanceof で判定できるのはクラスオブジェクトのみで、string、array、null、bool などと比較することはできません。
将来的に String クラスなどが実装されれば is_string() 等の代わりになるかもしれませんが、現状(執筆時の最新は PHP 5.6)ではまだのようですね。

instanceof は、2つのインスタンスが同じクラスであるかどうかを調べるためにも使えます。
また、クラス名としてリテラル(文字列)の変数を使うこともできます。

$bar1 = new Bar();
$bar2 = new Bar();

var_dump($bar1 instanceof $bar2); // TRUE

$str = 'Bar';
var_dump($bar1 instanceof $str); // TRUE

インターフェイスなどを実装しているかを調べるためにも instanceof が使用できます。

<?php
interface SampleInterface {}
class Foo implements SampleInterface{}

$foo = new Foo();
var_dump( $foo instanceof SampleInterface ); // TRUE

[PHP]統計学(平均、分散、標準偏差、偏差値)

PHP を使って分散(Variance)、標準偏差(Standard Deviation)、偏差値(Standard Score)を求めるサンプルです。
データ配列 $input を元に分散と標準偏差を計算し、$value の偏差値を求めます。

<?php
$input = array( 88, 32, 48, 95, 67, 45, 90 );
$value = 80;

$sumsq = 0;
$n = count($input);
$m = array_sum($input) / $n;	// 平均

foreach($input as $a){
	$sumsq += pow(abs($a - $m), 2);
}

$v   = ($n >= 2) ? $sumsq / ($n - 1) : 0;	// 不偏分散
$vp  = ($n > 0) ? $sumsq / $n : 0;			// 標本分散
$sd  = sqrt($v);							// 標本標準偏差
$sdp = sqrt($vp);							// 母標準偏差
$score = ($value - $m) / $sdp * 10 + 50;	// 偏差値

printf('Mean: %f, Variance: %f, SD: %f, Standard Score: %f', $m, $vp, $sdp, $score);

出力結果:

Mean: 66.428571, Variance: 545.959184,
SD: 23.365769, Standard Score: 55.808252

母標準偏差は Excel の関数でいう STDEVP() で、標本標準偏差は STDEV() に当たります。
どちらを使うかはデータが母集団そのものであるか母集団からとった標本であるかによって使い分けますが、統計学に関する詳細に関しては省略させていただきます。

参考文献: 宮川 公男(1999)『基本統計学』有斐閣