B-Teck!

お仕事からゲームまで幅広く

【PHP】文字列を配列に格納する(マルチバイト対応)

PHPのstr_splitにマルチバイト版がなかったので書いた。

<?php

/**
 * mb_str_split
 * str_splitのマルチバイト版
 * 
 * @access public
 * @param  string   $string 分割する文字列
 * @param  int      $split_length 分割後の文字数
 * @return array    $retAry 分割後の配列
 * @throws $split_lengthの値が0以下の場合Warning発生
 *         ※str_split準拠
 */
function mb_str_split($string,  $split_length = 1){
    // 0以下が指定された場合Warningを発生させる
    if($split_length <= 0){
        trigger_error("mb_str_split(): The length of each segment must be greater than zero",
                      E_USER_WARNING);
    }
    
    // 文字列を配列に分解
    $aryString = preg_split("//u", $string, -1, PREG_SPLIT_NO_EMPTY);
    
    // 文字数の指定がない場合、配列の要素数が0の場合はこのまま返す
    if($split_length === 1 || count($aryString) === 0){
        return $aryString;
    }
    
    // 引数の文字列毎に配列に詰め直す
    $tmpVal = "";
    foreach($aryString as $key => $value){
        if(($key + 1) % $split_length !== 0){
            $tmpVal = $tmpVal.$value;
        }else{
            $retAry[] = $tmpVal.$value;
            $tmpVal = "";
        }
    }
    
    // 余りの文字列があれば配列に足す
    if($tmpVal !== ""){
        $retAry[] = $tmpVal;
    }
    
    return $retAry;
}

var_dump(mb_str_split("吾輩は猫である。名前はまだ無い。"));
var_dump(mb_str_split("This is a pen."));
var_dump(mb_str_split("吾輩は猫である。名前はまだ無い。。", 3));
var_dump(mb_str_split("This is a pen.", 3));