狐の避暑地

PHPやJavaでプログラミングをしてます。狐が好きです。備忘録やゲームについて置いてあります。

処理のエラーコードをスマートにビット演算で返す

 あまりに昨日のエントリーがお粗末だったので今日は多少力を入れます。

使う目的

  • ユーザがデータを送った時(例えば名前、メールアドレスなど)にエラーを返したい
  • ビット演算を使う数少ない場面かな

環境

php5

方針

  1. 入力値のバリデートを行う
  2. エラーなら指定のビットを上げてエラーページに返す
バリデート

 仮定はPOSTで幾つかの値が帰ってきた想定

<?php
$err = 0;

//名前(空ならばNG)
if($_POST["name"] != ""){
    $err |= 0b0001;
}

//年齢(正の整数でなければNG)
if(! (ctype_digit(strval($_POST["age"])))){
    $err |= 0b0010;
}

//性別("male", "famele"以外はNG)
if(!(mb_preg_match($_POST["sex"], "male") ||
    mb_preg_match($_POST["sex"], "famale"))){
    $err |= 0b0100;
}

//規約への同意(チェックボックスが'on'以外はNG)
if($_POST['agree'] !== 'on'){
    $err |= 0b1000;
}

return $err;
?>
受け取りの処理
<?php
//$errはあるものとして

if($err & 0b0001) echo "名前不正";
if($err & 0b0010) echo "年齢不正";
if($err & 0b0100) echo "性別不正";
if($err & 0b1000) echo "同意不正";
if($err & 0b0000) echo "正常";

?>

備考

a | b ビット和

どちらかにあるビットが1
1001 | 0011 は 1011

a & b ビット積

どちらにもあるビットが1
1001 & 0011 は 0001

ifに入れた場合

理論式が0以外の場合はtrueとなるので、それを利用して振り分け可能

 フラグ管理にすると少しだけスマートで、エラーコードを生成する場合にも2進数を10進数に直すだけで表示出来るなど利点も多いですね。