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_format
や date_diff
にもマッチしちゃうから、例えば ;date(
のような文字列で検索しなければならないということです。次のようなルールになります。
- 関数名の直前には関数名に使用できない文字(
a-z
,A-Z
,0-9
,_
以外)がある。 - 関数名の直後には0個以上の空白文字と丸括弧の開始
(
がある。
- echo
- 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 date | 3 |
2 date_diff | 2 |
3 date_format | 1 |
完成でーす。
PHPで最もよく使われている関数は(私調べ)
私が過去に書いたとあるPHPスクリプトをチェックした結果はこうなりました。
関数名 | 回数 |
---|---|
1 preg_match | 90 |
2 in_array | 40 |
3 strstr | 35 |
4 trim | 34 |
5 number_format | 31 |
6 explode | 28 |
7 strlen | 22 |
8 curl_setopt | 22 |
9 str_replace | 19 |
10 unserialize | 18 |
11 preg_replace | 16 |
12 time | 13 |
13 file_put_contents | 12 |
14 serialize | 9 |
15 date | 9 |
16 implode | 8 |
17 is_array | 7 |
18 array_merge | 7 |
19 addslashes | 7 |
20 ob_flush | 6 |
以下省略 |
なんか恥ずかしいですね。こうやって自分の書いたコードでよく使われている関数をさらけ出すというのは。幼稚な関数使ってんなとか思われてたらどうしよう。
でわでわ
コメント