更改字符时拆分字符串

时间:2015-12-10 10:43:41

标签: php regex recursion string-split

我试图在所有"不同字符之间创建一个空格,例如:

"11131221133112" should result in "111 3 1 22 11 33 11 2"
"1321131112" should result in "1 3 2 11 3 111 2"

我尝试使用递归函数,不知道这是否是最佳方法,因为我无法在PHP中找到任何内置函数。这是我的功能:

function stringSplitter($str) {
    $strArr = str_split($str);

    foreach ($strArr as $key => $value) {
        if ($key == count($strArr)-1) return (substr($str, 0));

        if ($value != $strArr[$key+1]) {
            return (substr($str, 0, $key+1)." ".stringSplitter(substr($str, $key)));
        }
    }
}

出于某种原因,这个功能似乎无限迭代,我无法弄清楚原因。我哪里出错?

有更好的方法吗?我想使用explode来解决数组中的应答字符串,这可以直接完成吗?

4 个答案:

答案 0 :(得分:11)

RegEx 方法,
在RegEx \ 1 中,它是对 \ d

所捕获内容的反向引用
 <?php 
    $pattern    = '/(\d)\1*/';
    $str        = '11131221133112';

    $r = preg_match_all($pattern, $str, $result);
    if ($r !== FALSE) {
        var_dump(implode(' ', $result[0]));
    }
    else {
        print 'error';  
    }

答案 1 :(得分:5)

最简单的解决方案是:

$string = '11131221133112';
$strarr = str_split($string);
$tmp = null;
$newstr = '';
foreach($strarr as $a){
    $newstr .= ($a == $tmp) ? $a:' '.$a;
    $tmp = $a;
}

echo $newstr;

输出:111 3 1 22 11 33 11 2

答案 2 :(得分:2)

好问题:)

你可以循环你的角色并留意最后一个角色,如果它与当前角色不同,添加一个空格来输出,然后添加角色本身。

<?php
$string="11131221133112";
$last="";

for($i=0;$i<strlen($string);$i++)
{
   $output.= $string[$i]!=$last ? " ".$string[$i] :  $string[$i];
   $last=$string[$i];
}
$output=trim($output);

<强>输出

111 3 1 22 11 33 11 2

1 3 2 11 3 111 2

<强> Fiddle

答案 3 :(得分:0)

试试这个。

$string="11131221133112";
$seperated=str_split($string);
$lastChar='';
foreach ($seperated as $key => $value) {
    if($lastChar!=''&&$lastChar!=$value){
            echo ' ';
    }
    $lastChar=$value;
    echo $value;
}