我一直在努力解决这个问题,但我正在有效地尝试基于一组字母变体生成给定字符串的所有变体的数组/列表。

我有字符串“fabien”,并且我对涉及的每个字母都有一组变体。例如,A 可替换为 4,i 可替换为 1 和 l。因此,鉴于信息,我如何生成“fabien”的每个变体的列表。

$variants = array();
$variants['a'] = array('4');
$variants['i'] = array('1', 'l');

$string = 'fabien';

$result = getVariants('fabien', $variants);

print_r($results);

// Sample output:
Array ([0] => fabien [1] => f4bien [2] => fab1en [3] => fablen [4] => f4b1en [5] => f4blen)

最佳答案

您的案例可以通过递归轻松实现。那将是这样的:

function getVariants($string, $variants)
{
    //here's about stripping 1 symbol from string's right, so
    //may be you'll prefer to work with string functions:
    $string  = is_array($string)?$string:str_split($string);
    $symbol  = array_pop($string);
    $variant = array_key_exists($symbol, $variants)?
               array_merge([$symbol], $variants[$symbol]):
               [$symbol];
    $result  = [];
    if(!count($string))
    {
        return $variant;
    }
    foreach(getVariants($string, $variants) as $piece)
    {
        foreach($variant as $char)
        {
            $result[] = $piece.$char;
        }
    }
    return $result;
}

- 参见 fiddle 演示。这是如何工作的?答案是:长度为 N 的字符串的变体是它的正确符号的变体“乘以”没有该符号的部分变体(即长度为 N-1 )。我所说的“乘法”是指两组的 Decart 乘积,然后将某些对中的两部分串联起来。

关于php - 如何根据字母变体数组获取所有相似的字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19870498/

10-12 15:25