我会尽力描述我想要完成的事情:
让我们说每一封信都有一个或多个替代品:
a = a
b = X, Z
c = c
d = W, V, M
e = e
如果我给了一个字符串,比如'abcd',我想用替换组合来创建字符串,所以例如'abcd'会产生以下组合:
aXcW
aXcV
aXcM
aZcW
aZcV
aZcM
你能帮我写一个函数来创建和吐出所有组合的数组,无论每个字母有多少替换,以及字符串中有多少替换?所以它应该适用于ab和abbbdddd。
由于
答案 0 :(得分: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);