简体   繁体   English

如何根据字母变体数组获取所有类似的字符串

[英]How to get all the similar strings based on an array of letter variations

I keep trying to wrap my brain around this but I am effectively trying to generate an array/list of all variations of a given string based on an array of letter variations. 我一直试图将我的大脑包裹起来,但我正在有效地尝试根据一系列字母变化生成给定字符串的所有变体的数组/列表。

I have the string "fabien", and I have an array of variations for each letter involved. 我有字符串“fabien”,每个字母都有一系列的变化。 For instance A is replaceable with 4, i is replaceable with 1 and l. 例如A可以用4替换,i可以用1和l替换。 So given the information how can I generate a list of every variation of "fabien". 因此,根据信息,我如何生成“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)

Your case can be easily implemented with recursion. 您的案例可以通过递归轻松实现。 That will be like: 这将是:

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

-see fiddle demo. - 请小提琴演示。 How is this working? 这是怎么回事? The answer is: variation of string with length N is variations of it's right symbol 'multiplied' on variations of it's part without that symbol (ie with length N-1 ). 答案是:长度为N的字符串的变化是它的右边符号'乘以'的变化,它的部分没有那个符号(即长度为N-1 )。 By 'multiplication' I mean Decart product of two sets and then concatenation of two parts, that are in certain pair. '乘法'是指两组的Decart乘积,然后是两个部分的连接,即在某一对中。

If you don't mind using nested function, try the below: 如果您不介意使用嵌套函数,请尝试以下操作:

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

Output: 输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM