PHPのありそうでない便利関数コレクション
Posted: Updated:
なぜか基本的な関数がスカスカしているような気のする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が無かった時用の代替関数。結局、pregmatchなのはアレですが。関数名の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 思いついたら追加します。