【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] => !!!
) 

转载于:https://www.cnblogs.com/songgj/p/8442946.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值