用 PHP 生成所有可能的组合
Generate all possible combinations with PHP
我有一个数字序列,中间穿插有下划线:
_10_1_18_4_9_14__
我想在不触及数字的情况下用字母替换下划线,并生成完整的组合列表,但我不知道该怎么做。
现在我有这个:
$alph = 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");
echo $alph[0]."10".$alph[0]."1".$alph[0]."18".$alph[0]."4".$alph[0]."9".$alph[0]."14".$alph[0] .$alph[0];
现在,我不知道如何探索所有可能的组合。
有 208 827 064 576 种可能的组合,我必须将它们全部放在一个 .txt 文件中。这就是为什么我避免使用 "for"
有什么想法吗?
edit:对于示例,我们可以将组合的数量限制为 100,例如在循环中使用 $i ++。
我知道这会花很多时间 space
这可能不是很有效,但可以完成工作:
<?php
$alph = 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");
$a = array();
foreach( $alph as $l1 )
{
$a[0] = $l1.'10';
foreach( $alph as $l2 )
{
$a[1] = $l2.'1';
foreach( $alph as $l3 )
{
$a[2] = $l3.'18';
foreach( $alph as $l4 )
{
$a[3] = $l4.'4';
foreach( $alph as $l5 )
{
$a[4] = $l5.'9';
foreach( $alph as $l6 )
{
$a[5] = $l6.'14';
foreach( $alph as $l7 )
{
$a[6] = $l7;
foreach( $alph as $l8 )
{
$a[7] = ' '.$l8; // your example shows a space, not sure if that was intentional
// $line = implode( '', $a )."\r\n";
// Write $line to a file
}
}
}
}
}
}
}
}
示例输出:
A10A1A18A4A9A14A A
A10A1A18A4A9A14A B
A10A1A18A4A9A14A C
A10A1A18A4A9A14A D
A10A1A18A4A9A14A E
A10A1A18A4A9A14A F
A10A1A18A4A9A14A G
A10A1A18A4A9A14A H
A10A1A18A4A9A14A I
A10A1A18A4A9A14A J
A10A1A18A4A9A14A K
A10A1A18A4A9A14A L
A10A1A18A4A9A14A M
A10A1A18A4A9A14A N
A10A1A18A4A9A14A O
A10A1A18A4A9A14A P
A10A1A18A4A9A14A Q
A10A1A18A4A9A14A R
A10A1A18A4A9A14A S
A10A1A18A4A9A14A T
A10A1A18A4A9A14A U
A10A1A18A4A9A14A V
A10A1A18A4A9A14A W
A10A1A18A4A9A14A X
A10A1A18A4A9A14A Y
A10A1A18A4A9A14A Z
A10A1A18A4A9A14B A
A10A1A18A4A9A14B B
A10A1A18A4A9A14B C
A10A1A18A4A9A14B D
A10A1A18A4A9A14B E
A10A1A18A4A9A14B F
A10A1A18A4A9A14B G
A10A1A18A4A9A14B H
A10A1A18A4A9A14B I
A10A1A18A4A9A14B J
A10A1A18A4A9A14B K
A10A1A18A4A9A14B L
A10A1A18A4A9A14B M
A10A1A18A4A9A14B N
A10A1A18A4A9A14B O
A10A1A18A4A9A14B P
A10A1A18A4A9A14B Q
A10A1A18A4A9A14B R
A10A1A18A4A9A14B S
A10A1A18A4A9A14B T
A10A1A18A4A9A14B U
A10A1A18A4A9A14B V
A10A1A18A4A9A14B W
A10A1A18A4A9A14B X
A10A1A18A4A9A14B Y
A10A1A18A4A9A14B Z
A10A1A18A4A9A14C A
A10A1A18A4A9A14C B
A10A1A18A4A9A14C C
A10A1A18A4A9A14C D
A10A1A18A4A9A14C E
A10A1A18A4A9A14C F
A10A1A18A4A9A14C G
A10A1A18A4A9A14C H
您可以利用应用于字符串的 ++
运算符环绕并生成您想要的序列集这一事实,而不是使用大量嵌套循环。
$str = '_10_1_18_4_9_14_ _';
$letters = str_repeat('A', substr_count($str, '_'));
$limit = 100;
for ($i = 0; $i < $limit; $i++) {
echo interpolate($str, str_split($letters)), PHP_EOL;
$letters++;
}
function interpolate($str, $letters) {
while (($pos = strpos($str, '_')) !== false) {
$str[$pos] = array_shift($letters);
}
return $str;
}
这将问题分解为一个通用函数,该函数将字符串中的连续下划线替换为字母数组,并在每次迭代中简单地从 AAAAA...
递增字符串。
有关演示,请参阅 https://3v4l.org/GAEJN
我有一个数字序列,中间穿插有下划线:
_10_1_18_4_9_14__
我想在不触及数字的情况下用字母替换下划线,并生成完整的组合列表,但我不知道该怎么做。
现在我有这个:
$alph = 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");
echo $alph[0]."10".$alph[0]."1".$alph[0]."18".$alph[0]."4".$alph[0]."9".$alph[0]."14".$alph[0] .$alph[0];
现在,我不知道如何探索所有可能的组合。
有 208 827 064 576 种可能的组合,我必须将它们全部放在一个 .txt 文件中。这就是为什么我避免使用 "for"
有什么想法吗?
edit:对于示例,我们可以将组合的数量限制为 100,例如在循环中使用 $i ++。
我知道这会花很多时间 space
这可能不是很有效,但可以完成工作:
<?php
$alph = 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");
$a = array();
foreach( $alph as $l1 )
{
$a[0] = $l1.'10';
foreach( $alph as $l2 )
{
$a[1] = $l2.'1';
foreach( $alph as $l3 )
{
$a[2] = $l3.'18';
foreach( $alph as $l4 )
{
$a[3] = $l4.'4';
foreach( $alph as $l5 )
{
$a[4] = $l5.'9';
foreach( $alph as $l6 )
{
$a[5] = $l6.'14';
foreach( $alph as $l7 )
{
$a[6] = $l7;
foreach( $alph as $l8 )
{
$a[7] = ' '.$l8; // your example shows a space, not sure if that was intentional
// $line = implode( '', $a )."\r\n";
// Write $line to a file
}
}
}
}
}
}
}
}
示例输出:
A10A1A18A4A9A14A A
A10A1A18A4A9A14A B
A10A1A18A4A9A14A C
A10A1A18A4A9A14A D
A10A1A18A4A9A14A E
A10A1A18A4A9A14A F
A10A1A18A4A9A14A G
A10A1A18A4A9A14A H
A10A1A18A4A9A14A I
A10A1A18A4A9A14A J
A10A1A18A4A9A14A K
A10A1A18A4A9A14A L
A10A1A18A4A9A14A M
A10A1A18A4A9A14A N
A10A1A18A4A9A14A O
A10A1A18A4A9A14A P
A10A1A18A4A9A14A Q
A10A1A18A4A9A14A R
A10A1A18A4A9A14A S
A10A1A18A4A9A14A T
A10A1A18A4A9A14A U
A10A1A18A4A9A14A V
A10A1A18A4A9A14A W
A10A1A18A4A9A14A X
A10A1A18A4A9A14A Y
A10A1A18A4A9A14A Z
A10A1A18A4A9A14B A
A10A1A18A4A9A14B B
A10A1A18A4A9A14B C
A10A1A18A4A9A14B D
A10A1A18A4A9A14B E
A10A1A18A4A9A14B F
A10A1A18A4A9A14B G
A10A1A18A4A9A14B H
A10A1A18A4A9A14B I
A10A1A18A4A9A14B J
A10A1A18A4A9A14B K
A10A1A18A4A9A14B L
A10A1A18A4A9A14B M
A10A1A18A4A9A14B N
A10A1A18A4A9A14B O
A10A1A18A4A9A14B P
A10A1A18A4A9A14B Q
A10A1A18A4A9A14B R
A10A1A18A4A9A14B S
A10A1A18A4A9A14B T
A10A1A18A4A9A14B U
A10A1A18A4A9A14B V
A10A1A18A4A9A14B W
A10A1A18A4A9A14B X
A10A1A18A4A9A14B Y
A10A1A18A4A9A14B Z
A10A1A18A4A9A14C A
A10A1A18A4A9A14C B
A10A1A18A4A9A14C C
A10A1A18A4A9A14C D
A10A1A18A4A9A14C E
A10A1A18A4A9A14C F
A10A1A18A4A9A14C G
A10A1A18A4A9A14C H
您可以利用应用于字符串的 ++
运算符环绕并生成您想要的序列集这一事实,而不是使用大量嵌套循环。
$str = '_10_1_18_4_9_14_ _';
$letters = str_repeat('A', substr_count($str, '_'));
$limit = 100;
for ($i = 0; $i < $limit; $i++) {
echo interpolate($str, str_split($letters)), PHP_EOL;
$letters++;
}
function interpolate($str, $letters) {
while (($pos = strpos($str, '_')) !== false) {
$str[$pos] = array_shift($letters);
}
return $str;
}
这将问题分解为一个通用函数,该函数将字符串中的连续下划线替换为字母数组,并在每次迭代中简单地从 AAAAA...
递增字符串。
有关演示,请参阅 https://3v4l.org/GAEJN