2015-12-10 18 views
7

Tôi đang cố gắng để tạo ra một chuỗi với một không gian trống giữa tất cả các "nhân vật khác nhau, ví dụ:Chia chuỗi tại sự thay đổi của nhân vật

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

Tôi cố gắng này sử dụng một hàm đệ quy, không biết nếu điều này là . cách tốt nhất bởi vì tôi không thể tìm thấy bất kỳ xây dựng chức năng trong PHP cho điều này Đây là chức năng của tôi:

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

đối với một số lý do, chức năng này dường như lặp vô hạn, và tôi không thể hiểu tại sao Tôi đi sai ở đâu?

Có cách nào tốt hơn để thực hiện việc này không? Tôi muốn sử dụng phát nổ để ra chuỗi trả lời trong một mảng, điều này có thể được thực hiện trực tiếp?

+0

hãy tránh đăng câu trả lời của bạn (hoặc cố đó) để ra đời của mã trước ngày 25 được truyền – njzk2

Trả lời

2

đẹp câu hỏi :)

Bạn có thể lặp qua nhân vật của bạn và giữ một mắt trên người cuối cùng, nếu nó là khác nhau từ các ký tự hiện thêm một không gian để đầu ra, sau đó thêm các nhân vật chính nó.

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

Output

111 3 1 22 11 33 11 2 

1 3 2 11 3 111 2 

Fiddle

5

giải pháp đơn giản nhất là:

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

echo $newstr; 

đầu ra: 111 3 1 22 11 33 11 2

10

RegEx cách tiếp cận,
Trong RegEx \ 1 đó là một backreference cho những gì đã bị bắt bởi \ 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

tôi đã không đụng PHP trong khoảng 4 năm nhưng không nên nó được '! =' Hơn là '! == 'trong điều kiện * if *? – displayName

+0

'-1' không đủ jQuery ... nhưng nghiêm túc hơn, +1 để hiển thị trường hợp 1/100 hiếm khi một RegEx ** là ** thực sự hữu ích mà không bị ngửi mã ... (mặc dù tôi vẫn thích [regex- giải pháp ít hơn] (http://stackoverflow.com/a/34199965/719662) more * chuckle *) – vaxquis

+0

@displayName ** === ** được sử dụng để so sánh loại biến và giá trị của nó, ví dụ: thử nghiệm này sẽ trả lại * * true ** '0 == FALSE' ... –

0

Hãy thử điều này.

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

"Hãy thử điều này": Điều gì sẽ xảy ra nếu tôi thử? Nó sẽ thành công hay thất bại? –

Các vấn đề liên quan