Сформировать все возможные комбинации с PHP

Обновить

November 2018

Просмотры

234 раз

1

У меня есть последовательность чисел, перемежающихся с подчеркиванием:

_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. Вот почему я не использовать «для»

Есть идеи?

редактировать : Для примера , мы можем заблокировать количество комбинаций до 100, например , с $ я ++ в цикле.

Я знаю, что это займет много времени и пространства

2 ответы

2

Rather than using lots of nested loops, you can take advantage of the fact that the ++ operator applied to a string will wrap around and generate the set of sequences you want.

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

This breaks the problem down into a generic function that replaces successive underscores in a string with an array of letters, and simply increments the string from AAAAA... for each iteration.

See https://3v4l.org/GAEJN for a demo

1

This is probably not very efficient but it will get the job done:

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

Sample output:

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