我正在尝试创建一个函数来生成特定字符组的所有可能组合,并根据长度使其变量。
我有一个函数可以创建一个我想要的字符数组,这样可以正常工作。
function generate_characters($l, $n, $d) {
$r = array();
if ($l === true) {
foreach (range('a', 'z') as $index) {
array_push($r, $index);
}
}
if ($n === true) { array_push($r, '0','1','2','3','4','5','6','7','8','9'); }
if ($d === true) { array_push($r, '-'); }
return $r;
}
然后我需要根据$ length创建一个包含所有可能组合的数组,例如,如果' $ length = 1'我需要以下数组
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
[5] => f
[6] => g
[7] => h
[8] => i
[9] => j
[10] => k
[11] => l
[12] => m
[13] => n
[14] => o
[15] => p
[.... removed some values to save on length ....]
[35] => 9
)
但如果' $ length = 2'我需要这个
Array
(
[0] => aa
[1] => ab
[2] => ac
[3] => ad
[4] => ae
[5] => af
[6] => ag
[7] => ah
[8] => ai
[9] => aj
[.... removed some values to save on length ....]
[1329] => 97
[1330] => 98
[1331] => 99
)
我尝试过array_walk()和array_walk_recursive(),以及几个foreach和while循环,但没有用。
我可以通过为每个长度手动执行它来使其工作,但不是通过这样做可变长度,但不知道如何使其变长。
function generate_two($l, $n, $d) {
$r = array();
foreach (generate_characters($l, $n, false) as $v1) {
foreach (generate_characters($l, $n, $d) as $v2) {
array_push($results, "$v1$v2");
}
}
return $r;
}
所有这些,而没有' - '作为第一个字符,虽然我可以在生成数组后删除这些值,如果需要的话。
谢谢,Dan
答案 0 :(得分:1)
假设您要使用您创建的数组作为要附加的数组。我不明白为什么你需要使用除阵列之外的特定字符(我可能错了,但这可以很容易地适应以满足这一点)。
pd.merge(df_unstacked, df2, left_index=True, right_on='one')
要使用它,您可以使用您的发电机。
c [0.018, 0.372] (0.372, 0.771] (0.771, 0.995] one three two
id
1 3.081537 6.329819 3.386422 1 a 2
2 4.270542 2.553301 3.778536 2 a 1
3 3.125476 2.525016 3.013912 3 b 2
4 5.762223 3.763183 7.953551 4 b 2
答案 1 :(得分:0)
我不知道这是否是最佳解决方案,但是:
function generate_characters($length, $n, $d, $array = array()) {
$letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9');
$numbers = range(0, 9);
$others = array('-');
if($n == true)
$letters = array_merge($letters, $numbers);
if($d == true)
$letters = array_merge($letters, $others);
if(empty($array))
$array = $letters;
if(--$length <= 0)
return $array;
$result = array();
foreach ($array as $value) {
foreach ($letters as $add) {
$result[] = $value.$add;
}
}
return generate_characters($length, $n, $d, $result);
}
echo '<pre>';
print_r(generate_characters(3, true, true));
答案 2 :(得分:0)
如果要组合两个数组的值,可以直接使用此代码。您的函数中不需要该数组的长度。
function generateValue($array1, $array2) {
$result = array();
foreach ($array as $value) {
foreach ($original as $value2) {
$result[] = $value.$value2;
}
}
return $result;
}
print_r(generateValue($array1, $array2));
答案 3 :(得分:0)
function generate_characters($l, $n, $d)
{
// Start with an empty list
$r = array();
// Add the letters, if required
if ($l) {
$r = array_merge($r, range('a', 'z'));
}
// Add the digits, if required
if ($n) {
$r = array_merge($r, range('0', '9'));
}
// Add special characters, if required
if ($d) {
$r[] = '-';
}
return $r;
}
/**
* Generate all combinations of $len characters using the characters
* from a given list
*
* @param array $chars the list of characters to use
* @param int $len the length of strings to generate
* @return array
*/
function generate_combinations(array $chars, $len)
{
// $len <= 0: this is an error
// $len == 1: the input list is the output
if ($len <= 1) {
return $chars;
}
// Compute the output here
$result = array();
// Recursively compute the list of characters of length $len - 1
$partial = generate_combinations($chars, $len - 1);
// Append each entry from the input list to each string of length $len - 1 computed on the previous step
foreach ($partial as $head) {
foreach ($chars as $tail) {
// Put the combination in the output list
$result[] = $head.$tail;
}
}
// This is the list of all strings of length $len over the list $chars
return $result;
}
无需一次又一次致电generate_characters()
。给定相同的参数,它总是返回相同的字符列表。将其保存在变量中,进一步使用该变量。
$chars = generate_characters(TRUE, FALSE, TRUE);
$comb2 = generate_combinations($chars, 2);
$comb5 = generate_combinations($chars, 5);
虽然理论上是正确的,但生成所有组合在现实生活中完全没用。组合的数量呈指数级增长,很快您的脚本将使用所有可用内存来存储列表。
我测试了上面的代码,PHP 5.6需要超过2 GB的内存来生成5个字符的所有组合(使用字母+破折号)。 PHP 7使用内存更好,同一任务需要不到1 GB的内存。
您可以想象,不可能为参数$len
使用更高的值;即使是$len == 5
,上面列出的金额也已经很大了。