Разделить строку при смене символа

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

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

7

Решение

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';
}
11

Другие решения

Самое простое решение:

$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

5

Хороший вопрос 🙂

Вы можете циклически перемещаться по своим персонажам и следить за последним, если он отличается от текущего символа, добавить пробел для вывода, а затем добавить сам символ.

<?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

скрипка

2

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

$string="11131221133112";
$seperated=str_split($string);
$lastChar='';
foreach ($seperated as $key => $value) {
if($lastChar!=''&&$lastChar!=$value){
echo ' ';
}
$lastChar=$value;
echo $value;
}
0
По вопросам рекламы [email protected]