2015-12-10 18 views
7

Próbuję utworzyć ciąg z pustej przestrzeni między wszystkimi „różnych znaków, na przykład:Podziel ciąg na zmianę charakteru

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

Próbowałem to za pomocą funkcji rekurencyjnej, nie wiedząc, czy jest to . najlepszym sposobem, ponieważ nie mogłem znaleźć żadnej funkcji build-in w PHP za to to jest moja funkcja:

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))); 
     } 
    } 
} 

z jakiegoś powodu, ta funkcja wydaje się nieskończenie iteracyjne, i nie mogę zrozumieć, dlaczego Gdzie mogę się pomylić?

Czy jest lepszy sposób to zrobić? Chcę użyć rozbić, aby uzyskać ciąg odpowiadający w tablicy, czy można to zrobić bezpośrednio?

+0

należy unikać wysłaniem odpowiedzi (lub jego próba) do pojawienia się kodu przed 25. przepuszcza – njzk2

Odpowiedz

2

Nicea pytanie :)

Można pętli nad swoimi postaciami i pilnować ostatniego, jeżeli jest on różny od obecnego charakteru dodać przestrzeń do wyjścia, a następnie dodać samą postać.

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

Wyjście

111 3 1 22 11 33 11 2 

I

1 3 2 11 3 111 2 

Fiddle

5

Najprostszym rozwiązaniem jest:

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

echo $newstr; 

wyjściowa: 111 3 1 22 11 33 11 2

10

RegEx podejście,
W RegEx \ 1 to wsteczne do tego, co zostało zrobione przez \ 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'; 
    } 
+0

ja nie dotknął PHP w około 4 lat, ale nie powinno być '! =' Zamiast '! == 'w warunku * if *? – displayName

+0

'-1' za mało jQuery ... ale bardziej poważnie, +1 za pokazanie rzadkiego przypadku 1/100, gdy RegEx ** jest ** użyteczny, naprawdę bez zapachu kodu ... (chociaż nadal lubię [regex- mniej rozwiązanie] (http://stackoverflow.com/a/34199965/719662) więcej * chuckle *) – vaxquis

+0

@displayName ** === ** używane do porównywania typów zmiennych i jego wartości, na przykład ten test zwróci * * true ** '0 == FALSE' ... –

0

Spróbuj tego.

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

"Wypróbuj": Co się stanie, jeśli spróbuję? Czy to się powiedzie, czy nie? –