chunk_split

chunk_split関数:文字列を一定の文字数で区切る

使い方

$chunkstring = chunk_split( $text, $chunk_length, $end_of_chunk );

プログラマであれば、無性に文字列を一定数で区切りたくなることがありますよね?ありませんかね?
そんな、職業病にかかっているあなたに朗報です。
PHPではそんな関数がすでに用意されているのです。至れり尽くせりとはこのことか!

chunk_split関数は、文字列(第1引数)を一定の文字数(第2引数)ごとに特定の文字(第3引数)を挿入してくれる関数です。
デフォルトでは第2引数は76文字、第3引数は改行(\r\n)となっています。
つまり、76文字ごとに文字列に改行コードを挿入してくれるという役割を担ってくれます。

このchunk_split関数は、メール本文テキストやBASE64の文字列のように一定の文字数で改行したり、一定の文字数ごとに何かの文字を追加するといった処理で大活躍します。
先日のご紹介記事にbin2hex関数をご紹介したので、せっかくなのでそれとコラボしてみましょう。

16進数表現に変換した文字列をそのまま表示するととても見づらいので1バイトごとにスペースで区切ります。さらに、それでも少し見づらいので10バイト分(30文字)で改行して見やすくしてみます。

<?php
$text = '今日のPHP関数では、毎日1つずつPHPの関数をご紹介します。';

$bintext = bin2hex($text);
echo "BEFORE: ".$bintext."\n";

$chunked = chunk_split( $bintext, 2, " " );
echo "AFTER: ".$chunked."\n";

$dumptext = chunk_split( $chunked, 30 );
echo "DUMP: \n";
echo $dumptext."\n";

実行結果

BEFORE: e4bb8ae697a5e381ae504850e996a2e695b0e381a7e381afe38081e6af8ee697a531e381a4e3819ae381a4504850e381aee996a2e695b0e38292e38194e7b4b9e4bb8be38197e381bee38199e38082
AFTER: e4 bb 8a e6 97 a5 e3 81 ae 50 48 50 e9 96 a2 e6 95 b0 e3 81 a7 e3 81 af e3 80 81 e6 af 8e e6 97 a5 31 e3 81 a4 e3 81 9a e3 81 a4 50 48 50 e3 81 ae e9 96 a2 e6 95 b0 e3 82 92 e3 81 94 e7 b4 b9 e4 bb 8b e3 81 97 e3 81 be e3 81 99 e3 80 82
DUMP:
e4 bb 8a e6 97 a5 e3 81 ae 50
48 50 e9 96 a2 e6 95 b0 e3 81
a7 e3 81 af e3 80 81 e6 af 8e
e6 97 a5 31 e3 81 a4 e3 81 9a
e3 81 a4 50 48 50 e3 81 ae e9
96 a2 e6 95 b0 e3 82 92 e3 81
94 e7 b4 b9 e4 bb 8b e3 81 97
e3 81 be e3 81 99 e3 80 82

こんな感じに使うことができます。これまた便利な関数ですね。
ただし、注意点があります。毎度のことながら、ASCII文字以外は対応していませんので、マルチバイト文字列をCHUNKしたいと思ってやってみると文字の途中で区切られて、文字化けしますので注意が必要です。

実はそれも実装方法を工夫すればできなくもありません。
chunk_split関数の公式サイトにキリル文字用に独自の関数を作った奇特な方がスニペットを公開していますので、そちらを参考にするとよいでしょう。

使いどころ

base64_encode関数を使ってBASE64エンコードしたら、この関数を使って忘れずに一定文字数で改行するようにしましょう。でないとメールが文字化けする場合があります。
それ以外にも用途としてはいろいろな場合が考えられます。それこそ上に挙げたような16進数表現のバイト文字列のダンプとか、タグの挿入なんかにも使えます。

この関数を使ってどう料理するかはあなた次第!

公式サイト

http://jp1.php.net/manual/ja/function.chunk-split.php