PHPのありそうでない便利関数コレクション

なぜか基本的な関数がスカスカしているような気のする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 思いついたら追加します。