第一行代碼被轉換爲第二個代碼。我可以使用填充方法,但我想從最短路徑獲得解決方案並快速轉換。我將使用sql select部分中的代碼字段如何將字符串轉換爲數組字符
$it = "(a(am,bam),b(dam,cam))"; $to = "a.am, a.bam, b.dam, b.cam";
第一行代碼被轉換爲第二個代碼。我可以使用填充方法,但我想從最短路徑獲得解決方案並快速轉換。我將使用sql select部分中的代碼字段如何將字符串轉換爲數組字符
$it = "(a(am,bam),b(dam,cam))"; $to = "a.am, a.bam, b.dam, b.cam";
嘗試下面的代碼:
$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
函數即可。
殺死我吧。有一個更好的方法,但我的眼睛流血。
如果我從一個正則表達式開始,它可能會工作得更好,但我的正則表達式技能是生鏽的。
我一直用錘子敲擊你的數據,直到方釘通過圓孔。
<?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"
看到我的版本。它充滿活力。 – MahdiY
嘗試這種情況:
<?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」開頭,後跟句點和子字符串的其餘部分。
看到我的版本。它充滿活力。 – MahdiY
謝謝!你的代碼很有趣,而且速度也很快;請參閱https://3v4l.org/Bu4An/perf#output – slevy1
@ slevy1感謝您的速度測試! – MahdiY
謝謝,但代碼太長了:) –