2015-12-10 3 views
7

Я пытаюсь создать строку с пустым пространством между всеми «различными персонажами, например:Разбивает строка при изменении характера

"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 для вывода строки ответа в массиве, это можно сделать прямо?

+0

пожалуйста, избегайте размещения ваших ответов (или его попытка) к появлению кода до 25 передается – njzk2

ответ

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

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

10

RegEx подход,
В RegEx \ 1 это обратная ссылка на то, что был захвачен \ д

<?php 
    $pattern = '/(\d)\1*/'; 
    $str  = '11131221133112'; 

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

я не касался PHP примерно 4 лет, но она не должна быть '! = ', А не'! == 'в условии * if *? – displayName

+0

'-1' недостаточно jQuery ... но более серьезно, +1 для показа редкого случая 1/100, когда RegEx ** ** полезен действительно без запаха кода ... (хотя мне все еще нравится [regex- меньше решения] (http://stackoverflow.com/a/34199965/719662) подробнее * chuckle *) – vaxquis

+0

@displayName ** === ** используется для сравнения типа переменной и его значения, например, этот тест вернет * * true ** '0 == FALSE' ... –

0

Попробуйте это.

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

«Попробуй»: что произойдет, если я попробую? Будет ли это успешным или неудачным? –