【PHP】php分隔字符串为数组

工作中会经常分隔字符串为数组,我们可以用php内置函数str_split(),可是有时候字符串中包含中文,切割后会乱码,比如

print_r(str_split('dw氛围fesf',3));

 输出

Array
(
    [0] => php
    [1] =>  �
    [2] => ��
    [3] => ��
    [4] => ��
    [5] => ��
    [6] => �!!
    [7] => !
)


为了能处理多字节字符串
下面函数可以实现
function mbStringToArray($str) {
    if(empty($str)){
       return false;
    }
    $len = mb_strlen($str);
    $array = array();
    for($i = 0; $i<$len; $i++) {
        $array[] = mb_substr($str, $i, 1);
    }
    return $array;
}
/**
  * @param str $str    
  * @param int $length 截取长度
  * @param boole $byte 是否按字节分隔 false 按字符数分隔
  * @return array
*/
function _str_split($str,$length,$byte=false){
    if(mb_strwidth($str) == 1 || empty($str)){
       return $str;
    }
    if($encoding = mb_detect_encoding($str, null, true) === false ){
       return str_split($str, $length);
    }
    $utf8_str = mb_convert_encoding($str, 'utf8', $encoding);
    if($byte){
        $line = '';
        $split_arr = [];
        foreach (preg_split('//u', $utf8_str,-1,PREG_SPLIT_NO_EMPTY ) as $char) {
            $width = mb_strwidth($line.$char,'utf8');
            if($width <= $length){
                $line .= $char;
                continue;
            }
            $split_arr[] = str_pad($line, $width);
            $line = $char;
        }
        return $split_arr;
    }else{
        $str_arr = mbStringToArray($str);
        if($str_arr){
            $chunk_index = 0;
            $k_index = 0;
            $line = '';
            $chunks = [];
            foreach ($str_arr as $key=>$val){
                $line .= $val;
                $chunks[$k_index] = $line;
                if ($chunk_index++ == $length-1) {
                    $line = '';
                    $k_index++;
                    $chunk_index = 0;
                }
            }
        }
        return $chunks;
    }

}

 执行

print_r(_str_split($str,3,false));

 输出

Array
(
    [0] => php
    [1] =>  开发
    [2] => 者中心
    [3] => !!!
)
posted @ 2018-02-11 18:35  songguojun  阅读(2602)  评论(0编辑  收藏  举报