2011-06-04 20 views
2

我會盡我所能來形容我試圖做到:函數用於創建的字符串組合

比方說,爲每一封信我有一個或多個替換:

a = a 
b = X, Z 
c = c 
d = W, V, M 
e = e 

如果我「M給出一個字符串,說‘ABCD’,我想創建一個替代的組合時的字符串,因此,例如‘ABCD’會產生以下組合:

aXcW 
aXcV 
aXcM 
aZcW 
aZcV 
aZcM 

你能不能幫我寫一個函數,將創建並吐出所有組合的數組,無論每個字母有多少個替換項以及一個字符串中有多少個替換項發生?所以它應該使用ab和abbbdddd。

感謝

+0

看看str_replace()函數 – Niklas 2011-06-04 00:47:06

+3

你有什麼這麼遠嗎? – 2011-06-04 00:47:24

+0

@Oli查爾斯沃斯在這一點上沒有什麼,思考。 – DavidW 2011-06-04 00:58:28

回答

1

這裏是爲您

function repl($str, $map) { 
    if(strlen($str) == 0) 
     return array(''); 
    $out = array(); 
    foreach(repl(substr($str, 1), $map) as $r) 
     foreach($map[$str[0]] as $sub) 
      $out[] = $sub . $r; 
    return $out; 
} 

使用這樣

$map = array(
    'a' => array('1', '2', '3'), 
    'b' => array('@', '*'), 
    'c' => array('X', 'Y', 'Z') 
); 

$result = repl("abc", $map); 

一個簡單的遞歸解決方案要爲UTF8字符串(或任意子)工作,該函數應該接受的陣列字符串:

function repl($chars, $map) { 
    if(count($chars) == 0) 
     return array(''); 
    $out = array(); 
    foreach(repl(array_slice($chars, 1), $map) as $r) 
     foreach($map[$chars[0]] as $sub) 
      $out[] = $sub . $r; 
    return $out; 
} 

使用這樣

preg_match_all('~.~u', $str, $m); 
$chars = $m[0]; 
$result = repl($chars, $map); 
+0

真棒,非常感謝。現在我正在嘗試使用$ map地圖鍵作爲utf8字符 – DavidW 2011-06-04 16:08:52