どもです。
一続きの文字列を、一定の文字数またはバイト数で分割する備忘録。
//①文字数で分割する場合
$str = この文字列を分割する。
$length = 10; //分割文字数
$quantity = 3; //分割個数
$array = array();
$array[1] = $str;
for($i = 1; $i <= $quantity; $i++) {
$tmp = $array[$i];
if(mb_strlen($tmp) > $length){
$array[$i] = mb_substr($tmp, 0, $length);
if($i < $quantity) $array[$i+1] = mb_substr($tmp, mb_strlen($array[$i]), mb_strlen($tmp));
}else{
break;
}
}
//②バイト数で分割する場合
$str = この文字列を分割する。
$byte = 10; //分割バイト数
$quantity = 3; //分割個数
$array = array();
$array[1] = $str;
for($i = 1; $i <= $quantity; $i++) {
$tmp = $array[$i];
if(strlen($tmp) > $byte){
$array[$i] = mb_strcut($tmp, 0, $byte);
if($i < $quantity) $array[$i+1] = mb_strcut($tmp, strlen($array[$i]), strlen($tmp));
}else{
break;
}
}
両方とも$arrayに分割された文字列が入ります。
原理としては、まぁ見りゃわかるやつですが、
[i] = 切取(加工前の[i], 0, $byte);
[i+1] = 切取(加工前の[i], 文字カウント([i]), 文字カウント(加工前の[i]));
[i+1] = 切取(加工前の[i], 文字カウント([i]), 文字カウント(加工前の[i]));
( (str)対象文字列 , (int)開始位置, (int)終了位置 )
なので、Beforeは言うに及ばず、Afterは開始位置にBeforeの文字数、終了位置に加工前の文字列を入れているわけです。
バイト数の方、半角が入ったり奇数バイトを指定したときに文字を途中でぶった切らないか、ぱっと見て心配になりますが、mb_strcutさんはクッソ優秀なので心配ご無用です。
ちなみに、上記はハミ出た分をカットするやり方。
文字数は超えるけど溢れた文字列を最後の要素に収め切りたい、って場合はif($i<$quantity)を削除して($i=1; $i<=$quantity; $i++)を($i=1; $i<$quantity; $i++)にすればおk。周回を1周減らすだけです。
utf-8だけどCSV出力するからSJIS感覚でバイト数数えたいだよ~~ってときは、こっちの記事を参照。
mb_strcutの第三引数で文字コードまで指定できるから、やっぱmb_strcutさんはクッソ優秀。