gpt4 book ai didi

PHP 替换符号所有可能的变体

转载 作者:行者123 更新时间:2023-12-04 15:51:20 24 4
gpt4 key购买 nike

我有我想要替换的数组符号,但我需要生成所有的可能性

$lt = array(
'a' => 'ą',
'e' => 'ę',
'i' => 'į',
);

例如,如果我有这个字符串:
tazeki

可能有大量的结果:
tązeki
tazęki
tązęki
tazekį
tązekį
tazękį
tązękį

我的问题是使用什么公式来拥有所有变体?

最佳答案

这应该对你有用,简单易行:

这段代码有什么作用?

1. 数据部分

在数据部分,我只用关联数组(搜索字符作为键,替换为值)定义字符串和单个字符的替换。

2. getReplacements()功能

此函数获取必须以这种格式替换的字符的所有组合:

key   = index in the string
value = character

所以在这个代码示例中,数组看起来像这样:
Array (
[0] => Array (
[1] => a
)
[1] => Array (
[3] => e
)
[2] => Array (
[3] => e
[1] => a
)
[3] => Array (
[5] => i
)
[4] => Array (
[5] => i
[1] => a
)
[5] => Array (
[5] => i
[3] => e
)
[6] => Array (
[5] => i
[3] => e
[1] => a
)

)

如您所见,此数组包含必须替换的所有字符组合,格式如下:
[0] => Array (
//^^^^^ The entire sub array is the combination which holds the single characters which will be replaced
[1] => a
//^ ^ A single character of the full combination which will be replaced
//| The index of the character in the string (This is that it also works if you have a character multiple times in your string)
// e.g. 1 -> t *a* z e k i
// ^ ^ ^ ^ ^ ^
// | | | | | |
// 0 *1* 2 3 4 5
)

那么它是如何获得所有组合的呢?

非常简单,我遍历我想用 foreach 循环替换的每个字符,然后遍历我已有的每个组合,并将其与当前是 foreach 循环值的字符组合。

但是要让它工作,你必须从一个空数组开始。所以作为一个简单的例子来了解和理解我的意思:
Characters which have to be replaced (Empty array is '[]'): [1, 2, 3]
                               //new combinations for the next iteration
|
Character loop for NAN*:

Combinations:
- [] | -> []

Character loop for 1:

Combinations:
- [] + 1 | -> [1]

Character loop for 2:

Combinations:
- [] + 2 | -> [2]
- [1] + 2 | -> [1,2]

Character loop for 3:

Combinations:
- [] + 3 | -> [3]
- [1] + 3 | -> [1,3]
- [2] + 3 | -> [2,3]
- [1,2] + 3 | -> [1,2,3]
//^ All combinations here

* NAN:不是数字

所以你可以看到总是有: (2^n)-1共组合。同样从这个方法中,组合数组中还剩下一个空数组,所以在返回数组之前,我只使用 array_filter() 删除所有空数组和 array_values() 重新索引整个数组。

3. 更换零件

因此,要从字符串中获取所有字符,我将使用以下行构建组合:
array_intersect(str_split($str), array_keys($replace))

这只是巧合 array_intersect() 从字符串作为数组与 str_split() 和来自替换数组的键 array_keys() .

在此代码中,您传递给 getReplacements() 的数组函数看起来像这样:
Array
(
[1] => a
//^ ^ The single character which is in the string and also in the replace array
//| Index in the string from the character
[3] => e
[5] => i
)

4.替换所有组合

最后,您只需将源字符串中的所有组合替换为替换数组。为此,我只循环遍历每个组合,并将组合中字符串中的每个单个字符替换为替换数组中的匹配字符。

这可以简单地用这一行完成:
$tmp = substr_replace($tmp, $replace[$v], $k, 1);
//^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^ ^ Length of the replacement
//| | | Index from the string, where it should replace
//| | Get the replaced character to replace it
//| Replaces every single character one by one in the string

更多信息 substr_replace()参见手册: http://php.net/manual/en/function.substr-replace.php

在这一行之后,您只需将替换的字符串添加到结果数组中,然后将字符串重新放置到源字符串中。

代码:
<?php

//data
$str = "tazeki";

$replace = array(
'a' => 'ą',
'e' => 'ę',
'i' => 'į',
);


function getReplacements($array) {

//initalize array
$results = [[]];

//get all combinations
foreach ($array as $k => $element) {
foreach ($results as $combination)
$results[] = [$k => $element] + $combination;
}

//return filtered array
return array_values(array_filter($results));

}

//get all combinations to replace
$combinations = getReplacements(array_intersect(str_split($str), array_keys($replace)));

//replace all combinations
foreach($combinations as $word) {
$tmp = $str;
foreach($word as $k => $v)
$tmp = substr_replace($tmp, $replace[$v], $k, 1);
$result[] = $tmp;
}

//print data
print_r($result);

?>

输出:
Array
(
[0] => tązeki
[1] => tazęki
[2] => tązęki
[3] => tazekį
[4] => tązekį
[5] => tazękį
[6] => tązękį
)

关于PHP 替换符号所有可能的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28784358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com