用于创建字符串组合的函数

时间:2011-06-04 00:45:26

标签: php function

我会尽力描述我想要完成的事情:

让我们说每一封信都有一个或多个替代品:

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

如果我给了一个字符串,比如'abcd',我想用替换组合来创建字符串,所以例如'abcd'会产生以下组合:

aXcW
aXcV
aXcM
aZcW
aZcV
aZcM

你能帮我写一个函数来创建和吐出所有组合的数组,无论每个字母有多少替换,以及字符串中有多少替换?所以它应该适用于ab和abbbdddd。

由于

1 个答案:

答案 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);