なぜか基本的な関数がスカスカしているような気のするPHP
こんな関数があったらいいのに => きっとあるだろう => リファレンス漁っても無い orz
ということが日常茶飯事な感じのするPHP。よその言語では、そんな事はないんでしょうか。
それでも、人口数だけは抜群なPHPだけあって、それらしいキーワードでGoogle先生に訊けば、それっぽい関数が見つかってしまうのもPHPの良いところ。(コピペコードの培養土が肥沃すぎるとも言う)
今回はそんな関数コレクションを引用・参考元と共にペタペタするメモエントリー。
大半の関数には、引用・参考元があるので、それらの関数にはURLを付記しています。
配列操作系
PHPと言えば配列。配列と言えばPHP。それは無いか。配列については、滅多に不便することはなく、最初から充実してるとは思いますけれど痒いところ用。
/** * array_clean * http://d.hatena.ne.jp/H6K/20090601/p1 * * @param array $array * @return array */ function array_clean($array) { return array_merge(array_diff($array, array(''))); } /** * is_hash * http://d.hatena.ne.jp/fbis/20091112/1258002754 * * @param array $array * @return boolean */ function is_hash(& $array) { $i = 0; foreach ( $array as $k => $dummy ) { if ( $k !== $i++ ) return true; } return false; }
引用・参考
- array_clean
- 配列から空要素を削除して切り詰める。連想配列でもOK。( 配列の空要素を削除して切り詰める。 - Code is beautiful )
- is_hash
- 入力値が連想配列であるかどうかを判別する。( 配列か連想配列かを判別する - Unknown::Programming )
型判別・値確認系
主にctypeが無かった時用の代替関数。結局、preg_matchなのはアレですが。関数名のctype_接頭辞に馴染みが無いので、is_に合わせてます。
/** * is_alpha * * @param string $string * @return boolean */ function is_alpha($string) { if ( function_exists('ctype_alpha') ) return ctype_alpha($string); return (bool) preg_match('/^[a-zA-Z]+$/', $string); } /** * is_alnum * * @param string $string * @return boolean */ function is_alnum($string) { if ( function_exists('ctype_alnum') ) return ctype_alnum(strval($string)); return (bool) preg_match('/^[a-zA-Z0-9]+$/', $string); } /** * is_digit * * @param string $string * @return boolean */ function is_digit($string) { if ( function_exists('ctype_digit') ) return ctype_digit(strval($string)); return (bool) preg_match('/^[0-9]+$/', $string); } /** * in_range * * @param int $i * @param int $min * @param int $max * @return boolean */ function in_range($i, $min, $max) { return ($i >= $min) && ($i <= $max); } /** * is_date * http://www.php.net/manual/ja/function.checkdate.php#89773 * * @param string $date * @param string $opt * @return boolean */ function is_date($date, $opt) { $date = str_replace(array('\'', '-', '.', ',', ' '), '/', $date); $dates = array_clean(explode('/', $date)); if ( count($dates) != 3 ) return false; switch ( $opt ) { case 'iso' : $year = $dates[0]; $month = $dates[1]; $day = $dates[2]; break; case 'usa' : $year = $dates[2]; $month = $dates[0]; $day = $dates[1]; break; case 'eng' : $year = $dates[2]; $month = $dates[1]; $day = $dates[0]; break; default : return false; } if ( !is_numeric($month) || !is_numeric($day) || !is_numeric($year) ) { return false; } elseif ( !checkdate($month, $day, $year) ) { return false; } else { return true; } }
引用・参考
- is_alpha, is_alnum, is_digit
- それぞれ、アルファベット・アルファベット+数字・数字の判定。is_digitは、is_numericの何となく数字と区別して使われるので、実は使用頻度高いかも。自作。
- in_range
- 指定した数値範囲に収まっているか。あんまり探してないけど、ネイティブな関数ありそう....。自作。
- is_date
- チェックのさじ加減に困る関数。strtotimeの引数に使えるか、という基準で揃えてしまうのもアリかな。( PHP: checkdate - Manual )
文字列検査系
ただの前方一致や後方一致に、毎回preg_matchで正規表現エンジンを立ち上げるのも微妙だなー、と思っていたら、同じ理由で関数を作っている先人がいました。関数名はJavaとかC#の由来だそうで。
/** * bytelen * http://zombiebook.seesaa.net/article/33192046.html * * @param mixed $data * @retrn int $length */ function bytelen($data) { return strlen(bin2hex($data)) / 2; } /** * startsWith * http://blog.anoncom.net/2009/02/20/124.html * * @param string $haystack * @param string $needle * @return boolean */ function startsWith($haystack, $needle){ return strpos($haystack, $needle, 0) === 0; } /** * endsWith * http://blog.anoncom.net/2009/02/20/124.html * * @param string $haystack * @param string $needle * @return boolean */ function endsWith($haystack, $needle){ $length = (strlen($haystack) - strlen($needle)); if( $length <0) return false; return strpos($haystack, $needle, $length) !== false; } /** * matchesIn * http://blog.anoncom.net/2009/02/20/124.html * * @param string $haystack * @param string $needle * @return boolean */ function matchesIn($haystack, $needle){ return strpos($haystack, $needle) !== false; }
引用・参考
- bytelen
- mb_string.func_overloadが有効(かもしれない)環境でも、安定してlengthを取得できる関数。実際は、bin2hexにより画像でもOK。( php:バイト数の取得(strlen は mb_strlen にオーバーロードされる): Script雑感 )
- startsWith, endsWitdh, matchesIn
- それぞれ前方一致・後方一致・部分一致の役割。( anoncom blog » Blog Archive » PHPでの簡易文字列の一致の判定 )
他にもこういう便利関数あると思う
特に、他言語由来の関数とか、知っておくと幸せになれる関数が、まだまだ沢山ありそう。今回の掲載分だと、日付操作系とか、ファイル操作系が抜けてるかな? 見つけたら or 思いついたら追加します。