3

我一直试图围绕这个问题思考,但我实际上是在尝试根据字母变体数组生成给定字符串的所有变体的数组/列表。

我有字符串“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)
4

2 回答 2

3

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

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;
}

- 见小提琴演示。这是如何工作的?答案是:字符串与长度N的变化是它的正确符号的变化“乘以”它没有该符号的部分的变化(即长度N-1)。通过“乘法”,我的意思是 Decart 两个集合的乘积,然后是两个部分的串联,它们是特定的一对。

于 2013-11-09T11:28:08.853 回答
1

如果您不介意使用嵌套函数,请尝试以下操作:

function getVariants($string, $variants)
{
    // Store extra params for the recusion
    function _getVariants($string, $variants, $batch, $i, &$results)
    {
        if ($i >= strlen($string))
        {
            $results[] = $batch;
        }
        else
        {
            $character = $string[$i];

            // By default, just concat the current character
            _getVariants($string, $variants, $batch . $character, $i + 1, $results);

            if ( ! empty($variants[$character]))
            {
                // If there is something to replace
                foreach ($variants[$character] as $character)
                {
                    // Concat the replaced character
                    _getVariants($string, $variants, $batch . $character, $i + 1, $results);
                }
            }
        }
    }

    $results = array();
    _getVariants($string, $variants, '', 0, $results);
    return $results;
}

输出:

Array ( [0] => fabien [1] => fab1en [2] => fablen [3] => f4bien [4] => f4b1en [5] => f4blen )
于 2013-11-09T04:41:56.310 回答