Parallels Desktop ブラックフライデーセール 25%OFFGo!

PHPでよく使う関数を調べるスクリプト

PHPでよく使う関数を調べるスクリプト

PHPの関数、とても便利で重宝しておりますが、どんな関数がよく使われているか気になったので、調べるスクリプトを作りました。ぜひご利用ください。

目次

PHPよく使う関数チェッカー

  • PHPのコードで組み込み関数が何回使われているかを数えます。
  • テキストエリアにPHPコードをコピペして[チェック]を押してください。

結果

関数名回数
データがありません

制作過程

定義済み関数の一覧を調べる

まず、PHPの組み込み関数の一覧をどこから手に入れるかですが、PHPに定義済み関数の一覧を調べる関数 get_defined_functions というのがありました。私のためにありがとう。

$定義済関数の配列 = get_defined_functions();

var_export($定義済関数の配列);

//実行結果
array (
  'internal' => 
  array (
    0 => 'zend_version',
    1 => 'func_num_args',
    2 => 'func_get_arg',
    3 => 'func_get_args',
    4 => 'strlen',
    5 => 'strcmp',
    6 => 'strncmp',
    7 => 'strcasecmp',
    8 => 'strncasecmp',
    9 => 'each',
    10 => 'error_reporting',
...中略...
  ),
  'user' => 
  array (
  ),
)

こんな感じでキー internal の下に組み込み関数の一覧、user の下にユーザ定義関数の一覧が入ります。

文字列の出現回数を数える

関数名の一覧がゲットできたわけですから、あとは foreach でグルグル回しながら関数名の出現回数を数えればいいだけです。もう完成したも同然ですね。

文字列の出現回数を数える関数は substr_count です。

//使い方
substr_count(検索対象の文字列, 検索する文字列)
//定義済み関数を取得
$定義済関数の配列 = get_defined_functions();
//仮ののPHPコード
$コード = '... strlen();strlen();strlen();trim();trim();date(); ...';
//配列の宣言(何も値が入らなかった時用)
$結果の配列 = null;

//定義済み関数ひとつひとつがコードに何回出現するかチェック
foreach($定義済関数の配列['internal'] as $関数名){
    //出現回数を数える
    $出現回数 = substr_count($コード, $関数名);
    //出現回数が1以上ならば連想配列に入れる
    if($出現回数){
        $結果の配列[$関数名] = $出現回数;
    }
}

//出力
var_export($結果の配列);

//実行結果
array (
  'strlen' => 3,
  'date' => 1,
  'trim' => 2,
)

いえーい、楽勝でした。というわけにはいかず。

仮のPHPコードを変えたら実行結果がおかしいことに気付きました。

//仮ののPHPコード
$コード = '... date();date();date();date_diff();date_diff();date_format(); ...';

//実行結果
array (
  'date' => 6,
  'date_format' => 1,
  'date_diff' => 2,
  '_' => 3,
)

date が6個あることになってます。重複する名前の関数があったら全部カウントしちゃうのね。当たり前か。

そして _ という名前の関数があるんですね。調べてみたら gettext の別名だそうです。

正規表現で検索して数える

というわけで、部分一致を避けてちゃんと数えるならば正規表現を使わないとダメっぽいです。preg_filter 関数を使います。正規表現による検索と置換を行う関数ですが、置換した回数を数えることができるのでこれを利用します。

//使い方
preg_filter(検索パターン, 置換文字列, 検索対象, 置換を行う最大回数, 置換回数を入れる変数)

さて、似ている関数名を重複してカウントしないようにするには、関数名の直前と直後にある文字も込みで検索します。

つまり、関数名 date で検索すると date_formatdate_diff にもマッチしちゃうから、例えば ;date( のような文字列で検索しなければならないということです。次のようなルールになります。

  • 関数名の直前には関数名に使用できない文字(a-z, A-Z, 0-9, _ 以外)がある。
  • 関数名の直後には0個以上の空白文字と丸括弧の開始 ( がある。

正確には関数名に日本語なども使えますが、今回は組み込み関数が検索対象なので無視しまーす。

関数名と括弧の間にスペース入れますか?入れない人のほうが多いと思いますが、入れる人もいるので、関数名の直後の「0個以上の空白文字」を考慮しています。

PHPでは関数名の後には必ず括弧 () があります。括弧がないのもあるぞと思うかもしれませんが、それは関数ではなく言語構造です。

関数のようで関数でないモノ
  • echo
  • print
  • exit
  • die
  • return
  • require
  • include などなど…

以上を踏まえて preg_filter 関数を使って書き直しました。

//定義済み関数を取得
$定義済関数の配列 = get_defined_functions();
//仮ののPHPコード
$コード = '... date();date();date();date_diff();date_diff();date_format(); ...';
//配列の宣言(何も値が入らなかった時用)
$結果の配列 = null;

//定義済み関数ひとつひとつがコードに何回出現するかチェック
foreach($定義済関数の配列['internal'] as $関数名){
    //出現回数を数える
    preg_filter("/[^0-9a-zA-Z_]+$関数名\s*\(/", '', $コード, -1, $出現回数);
    //出現回数が1以上ならば連想配列に入れる
    if($出現回数){
        $結果の配列[$関数名] = $出現回数;
    }
}

//出力
var_export($結果の配列);

//実行結果
array (
  'date' => 3,
  'date_format' => 1,
  'date_diff' => 2,
)

ランキング形式にしてテーブルで表示する

配列で出力することに成功したので、これを出現回数の多い順にソートして、さらにテーブルで表示したいと思います。みんなランキングが大好きだからね。

連想配列のキーと要素の関係を維持したまま降順(大→小)にソートする関数 arsort を使います。

//使い方
arsort(配列, ソートタイプのフラグ)

では、やってみましょう。

//定義済み関数を取得
$定義済関数の配列 = get_defined_functions();
//仮ののPHPコード
$コード = '... date();date();date();date_diff();date_diff();date_format(); ...';
//変数の宣言(何も値が入らなかった時用)
$結果の配列 = null;
//変数の宣言(何も値が入らなかった時用)
$テーブル = null;

//定義済み関数ひとつひとつがコードに何回出現するかチェック
foreach($定義済関数の配列['internal'] as $関数名){
    //出現回数を数える
    preg_filter("/[^0-9a-zA-Z_]+$関数名\s*\(/", '', $コード, -1, $出現回数);
    //出現回数が1以上ならば連想配列に入れる
    if($出現回数){
        $結果の配列[$関数名] = $出現回数;
    }
}

//$結果の配列に何か入っていたら
if(isset($結果の配列)){
    //降順にソート
    arsort($結果の配列);
    //順位を表す数字
    $数 = 1;
    //配列をグルグルして処理していく
    foreach($結果の配列 as $関数名 => $出現回数){
        //1〜3位にメダルっぽい色を付ける
        if    ($数 == 1){$順位の色 = '#dbb400';}
        elseif($数 == 2){$順位の色 = '#9fa0a0';}
        elseif($数 == 3){$順位の色 = '#c47022';}
        else            {$順位の色 = '#666';}
        //順位
        $順位 = "<span style=\"background:$順位の色;\">$数</span>";
        //テーブルの行を変数に入れる
        $テーブル .= "<tr><td>$順位 $関数名</td><td>$出現回数</td></tr>".PHP_EOL;
        //順位を+1
        $数++;
    }
}

//出力
echo '<table>';
echo '<thead>';
echo '<tr><th>関数名</th><th>回数</th></tr>';
echo '</thead>';
echo '<tbody>';
echo $テーブル;
echo '</tbody>';
echo '</table>';
実行結果
関数名回数
1 date3
2 date_diff2
3 date_format1

完成でーす。

PHPで最もよく使われている関数は(私調べ)

私が過去に書いたとあるPHPスクリプトをチェックした結果はこうなりました。

関数名回数
1 preg_match90
2 in_array40
3 strstr35
4 trim34
5 number_format31
6 explode28
7 strlen22
8 curl_setopt22
9 str_replace19
10 unserialize18
11 preg_replace16
12 time13
13 file_put_contents12
14 serialize9
15 date9
16 implode8
17 is_array7
18 array_merge7
19 addslashes7
20 ob_flush6
以下省略

なんか恥ずかしいですね。こうやって自分の書いたコードでよく使われている関数をさらけ出すというのは。幼稚な関数使ってんなとか思われてたらどうしよう。

でわでわ

PHPでよく使う関数を調べるスクリプト

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次