PHPにおける配列変換の最適化
文字列に対して何かを行うために、常に配列に分割する必要はありません。
例を見てみましょう。
次の例では、コードの著者が文字列内に数字 3 が含まれているかチェックしています:
<?php
$str = '12345';
$arr = explode('', $str); // 配列に分割
if (in_array(3, $arr)) {
echo '含まれる';
} else {
echo '含まれない';
}
?>
著者は素晴らしい - 独自の不完全な解決策を書く代わりに、 PHPの組み込み関数を使用しています。
しかし、コードは依然として最適ではありません:ここでは文字列を配列に分割する必要はありません。
なぜなら、文字列内を検索する既製の関数 strpos が存在するからです:
<?php
$str = '12345';
if (strpos($str, '3') !== false) {
echo '含まれる';
} else {
echo '含まれない';
}
?>
なぜここで配列に分割することが悪いのでしょうか?なぜなら、 第一に、配列への分割にはプロセッサリソースが消費され、 第二に、得られた配列はRAM内に場所を占有するからです (しかも、その占有量は元の文字列が占める場所よりも大きくなります)。
教訓:それを避ける方法があるなら、文字列を配列に分割しないでください。
次のコードでは、あるプログラマーが文字列の文字を逆順に並べ替えています。 このプログラマーの解決策を最適化してください:
<?php
$str = '12345';
$rev = implode('', array_reverse(explode('', $str)));
echo $rev; // '54321' を出力
?>
次のコードでは、あるプログラマーがテキスト内の単語数を探しています。 このプログラマーの解決策を最適化してください:
<?php
$str = 'aaa bbb ccc'; // ある長い文字列
echo count(explode(' ', $str));
?>