院生エンジニアのにっき

  • Change style to Blue
  • Change style to Red
  • Change style to Green
  • Change style to Pink

PHPにて、整数のみtrueを返す   2008-04-06

PHPで数値のValidate - /halt/Snapshotにて

「普通のぺちぱーはis_numericを使います」とあったのでエントリー

2008-02-10 - kengpong)のエントリーについて

is_numericは小数もtrueなんでそんな普通のぺちぱーはバグを作り込むだけなような・・・

id:kengpongさんの考え方はPHPやってると忘れがちなんですが好きです。

でもコメントアウトしてるctype_digitは「ctype_digitの仕様にハマる。」にもありますが、個人的にも以前""がtrue/falseとバージョンによって戻り値が違って差異を吸収するラッパー関数作ったこともあるんで最近は使ってないですね。

ソースから話の流れを追ってみると、

function isInt1($value) { #正規表現のみ
  return !!preg_match('/^-?[0-9]+$/', $value);
}

だとtrueがtrueになっちゃうんで

function isInt2($value) { #正規表現+is関数
  if(is_integer($value) || is_float($value) || is_string($value)) {
    return !!preg_match('/^-?[0-9]+$/', $value);
    #または return ctype_digit((string)$value); ※後述
  }
  return false;
}

にしようってことで、

function isInt3($value) { #・・・というかis_numeric
  return is_numeric($value);
}

だとそもそもisIntじゃないってことでしょうか。

表にしてみると

isInt($value) 正規表現 正規表現+is関数 is_numeric
1 bool(true) bool(true) bool(true)
1.1 bool(false) bool(false) bool(true)
'1' bool(true) bool(true) bool(true)
'1.1' bool(false) bool(false) bool(true)
(float)1 bool(true) bool(true) bool(true)
true bool(true) bool(false) bool(false)
false bool(false) bool(false) bool(false)

ってとこですかね。

PHPプログラマとしての能力はPHPの関数をどれだけ知っているかで決まる。

はおっしゃる通りですよね。私もPHPを使い出して4年近く(趣味・バイト併せて)なりますがまだまだ新しい発見があります。日々修行ですね。。

あと、「!!preg_match」でbool値にして返す手法も今日知りましたw


確認用:

function isInt1($value) { #正規表現のみ
  return !!preg_match('/^-?[0-9]+$/', $value);
}
function isInt2($value) { #正規表現+is関数
  if(is_integer($value) || is_float($value) || is_string($value)) {
    return !!preg_match('/^-?[0-9]+$/', $value);
    #または return ctype_digit((string)$value);
  }
  return false;
}
function isInt3($value) { #・・・というかis_numeric
  return is_integer($value);
}

function isInt($value) {
  return isInt1($value); #2,3に変更して確認下さい
}
var_dump(isInt(1));
var_dump(isInt(1.1));
var_dump(isInt('1'));
var_dump(isInt('1.1'));
var_dump(isInt((float)1));
var_dump(isInt(true));
var_dump(isInt(false));


コメントを書く