Я пытаюсь создать строку с пробелом между всеми «различными символами, например:
"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 для вывода строки ответа в массиве, это можно сделать напрямую?
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';
}
Самое простое решение:
$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
Хороший вопрос 🙂
Вы можете циклически перемещаться по своим персонажам и следить за последним, если он отличается от текущего символа, добавить пробел для вывода, а затем добавить сам символ.
<?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
Попробуй это.
$string="11131221133112";
$seperated=str_split($string);
$lastChar='';
foreach ($seperated as $key => $value) {
if($lastChar!=''&&$lastChar!=$value){
echo ' ';
}
$lastChar=$value;
echo $value;
}