2017-06-24 92 views
3

第一行代碼被轉換爲第二個代碼。我可以使用填充方法,但我想從最短路徑獲得解決方案並快速轉換。我將使用sql select部分中的代碼字段如何將字符串轉換爲數組字符

 $it = "(a(am,bam),b(dam,cam))"; 
$to = "a.am, a.bam, b.dam, b.cam";

回答

5

嘗試下面的代碼:

$it = "(a(am,bam),b(dam,cam))"; 

function iDelimiter($str) { 

    $count = 0; 
    $str = str_split($str); 

    foreach($str as &$value) { 

     if($value == "(") { 
      $count++; 
     } elseif($value == ")") { 
      $count--; 
     } 

     if($value == "," && ! $count) { 
      $value = "|"; 
     } 

    } 

    return explode("|", implode($str)); 

} 

function iParser($str, $_prefix = "") { 

    preg_match("/^((?!(\(|\))).)*\((.*)\)$/", $str, $m); 

    if(count($m) < 4) { 
     return (strlen($_prefix) ? $_prefix . "." : '') . $str; 
    } 

    $prefix = (strlen($_prefix) ? $_prefix . "." : '') . $m[1]; 

    $str = $m[3]; 

    if(strpos($str, "(") === false) { 

     $return = explode(",", $str); 

     $pad = preg_filter('/^/', strlen($prefix) ? $prefix . '.' : '', $return); 

     return implode($pad, ","); 
    } else { 

     $str = iDelimiter($str); 

     $return = array_map('iParser', $str, array_pad(array(), count($str), $prefix)); 

     return implode($return, ", "); 
    } 

} 

print_r(iParser($it)); 

它解析括號內的每一個深度。只需將您的字符串傳遞給iParser函數即可。

+0

謝謝!你的代碼很有趣,而且速度也很快;請參閱https://3v4l.org/Bu4An/perf#output – slevy1

+0

@ slevy1感謝您的速度測試! – MahdiY

+0

謝謝,但代碼太長了:) –

0

殺死我吧。有一個更好的方法,但我的眼睛流血。

如果我從一個正則表達式開始,它可能會工作得更好,但我的正則表達式技能是生鏽的。

我一直用錘子敲擊你的數據,直到方釘通過圓孔。

<?php 

$it = "(a(am,bam),b(dam,cam))"; 
$it = substr($it, 1, -1); 
//$to = "a.am, a.bam, b.dam, b.cam"; 

$final = []; 

$test = explode("),", $it); 
foreach($test as $section) { 
    $letter = substr($section, 0, 1); 
    $remainder = substr($section, 2); 
    if(strpos($remainder, ")")) { 
     $remainder = substr($remainder, 0, strpos($remainder, ")")); 
    } 
    echo $letter . " ".$remainder."\n"; 
    foreach(explode(",", $remainder) as $fragment) { 
     array_push($final, $letter.".".$fragment); 
    } 
} 

var_dump($final); 

var_dump(implode($final, ", ")); 

息率

a am,bam 
b dam,cam 
array(4) { 
    [0]=> 
    string(4) "a.am" 
    [1]=> 
    string(5) "a.bam" 
    [2]=> 
    string(5) "b.dam" 
    [3]=> 
    string(5) "b.cam" 
} 
string(22) "a.am, a.bam, b.dam, b.cam" 
+0

看到我的版本。它充滿活力。 – MahdiY

2

嘗試這種情況:

<?php 

function str2Arr($s, $r, $str) { 

    $str = trim(str_replace($s, $r, $str)); 
    return explode(" ", $str); 
} 

$it = "(a(am,bam),b(dam,cam))"; 
//$to = "a.am, a.bam, b.dam, b.cam"; 


$search = ['),', '(', ')', ',', 'a a', 'b d', 'ba', 'c']; 

$replace =[' ', ' ', ' ', ' ', 'a.a','b.d', 'a.ba', 'b.c']; 

var_dump(implode(", ",(str2Arr($search, $replace, $it)))); 

參見demo

在不使用一個正則表達式之一可以實現通過使用str_replace函數(指定的轉換),其使用字符數組t o在主題字符串中找到時,用另一個字符數組替換。非字母字符每個都用空格替換,並且替換子字符串,以便每個字符以適當的「a」或「b」開頭,後跟句點和子字符串的其餘部分。

+0

看到我的版本。它充滿活力。 – MahdiY

相關問題