PHP делает все возможные варианты 4char A-Z, a-z, 0-9 - PullRequest
2 голосов
/ 17 января 2011

Я должен составить список всех возможных пермуляций из 4-х символов A-Z, a-z, 0-9 и всех этих сочетаний. Как я могу пройти через все возможные комбинации и распечатать их?

для чего это нужно: мне нужно сделать это в html-документе, который я затем смогу распечатать и дать все это в виде случайных уникальных имен пользователей для нашего университета, чтобы студенты могли предоставлять обратную связь на основе одного уникального идентификатора, который будет недействительным при использовании. я не могу изменить эту процедуру на лучшую!

Ответы [ 6 ]

6 голосов
/ 17 января 2011

Предупреждение: это занимает некоторое время для вычисления, потому что есть 62 ^ 4 = 14776336 возможных комбинаций. Это также занимает много памяти, если вы накапливаете результаты и не печатаете их напрямую.

function print_combinations($characters, $length, $combination = '') {
        if ($length > 0) {
            foreach ($characters as $i) {
                print_combinations($characters, $length - 1, $combination . $i);
            }
        } else {
            printf("%s\n", $combination);
        }
}

$characters = array_merge(range('A', 'Z'), range('a', 'z'), range(0, 9));
print_combinations($characters, 4);
2 голосов
/ 17 января 2011

При довольно нетрадиционном подходе вы можете использовать dec2any из комментариев к документации php для base_convert , например:

$index = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$base = strlen($index);
$len = 4;

for ($i = 0, $l = pow(strlen($index), $len); $i < $l; $i++) {
    echo str_pad(dec2any($i, $base, $index), $len, "0", STR_PAD_LEFT), "\n";
} 

function dec2any( $num, $base=62, $index=false ) {
    if (! $base ) {
        $base = strlen( $index );
    } else if (! $index ) {
        $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
    }
    $out = "";
    for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
        $a = floor( $num / pow( $base, $t ) );
        $out = $out . substr( $index, $a, 1 );
        $num = $num - ( $a * pow( $base, $t ) );
    }
    return $out;
}

Его можно легко адаптировать, изменив $ index и $ len.

0 голосов
/ 13 февраля 2013

Более универсальный подход с разделителем:

function getCombinations($base,$delimiter="|"){

    $base = array_values($base);
    $baselen = count($base);

    if($baselen == 0){
        return;
    }
    if($baselen == 1){
        return $base[0];
    }else{
        //get one level lower combinations
        $oneLevelLowerArray = $base;
        $orig_part = $oneLevelLowerArray[0];
        unset($oneLevelLowerArray[0]);
        $oneLevelLower = getCombinations($oneLevelLowerArray,$delimiter);
        $countOLL = count($oneLevelLower);
        foreach ($orig_part as $rowa) {
            foreach ($oneLevelLower as $rowb) {
                $resultArray[] = $rowa.$delimiter.$rowb;
            }
        }

    }

    return $resultArray;


}
0 голосов
/ 17 января 2011

Немного срочно, но:

class Combinations{

    protected $characters = array();
    protected $combinations = array();

    public function __construct($characters){
        $this->characters = $characters;
    }

    public function getCombinations($length){       

        foreach($this->characters as $comb)
        {
            $this->getRecurse($comb, $length - 1);
        }

    $combinations = $this->combinations;
    $this->combinations = array();

    return $combinations;

    }

    public function getRecurse($combination, $length){

        if($length <= 0){
            $this->combinations[] = $combination;
        }else{
            foreach($this->characters as $comb)
            {
                $this->getRecurse($combination.$comb, $length - 1);
            }
        }

    }

}

$characters = array_merge(range('A', 'Z'), range('a', 'z'), range(0, 9));

$comb = new Combinations($characters);

print_r( $comb->getCombinations(4) );

Число, переданное в getCombinations - это то, как долго вы хотите, чтобы комбинации были.

0 голосов
/ 17 января 2011
$numbers = range(0, 9);
$lowerCaseLetters = range('a', 'z');
$upperCaseLetters = range('A', 'Z');

foreach($numbers as $number) {
   foreach($lowerCaseLetters as $lowerCaseLetter) {
      foreach($uperCaseLetters as $upperCaseLetter) {
          echo $number.$lowerCaseLetter.$upperCaseLetter.'<br />';
          echo $number.$upperCaseLetter.$lowerCaseLetter.'<br />';
          echo $lowerCaseLetter.$number.$upperCaseLetter.'<br />';
          echo $lowerCaseLetter.$upperCaseLetter.$number.'<br />';
          echo $upperCaseLetter.$lowerCaseLetter.$number.'<br />';
          echo $upperCaseLetter.$number.$lowerCaseLetter.'<br />';
      }
   }
}
0 голосов
/ 17 января 2011

Что-то в этом роде? (псевдокод)

$a = array_merge(range('A', 'Z'), range('a', 'z'), range(0, 9));

foreach($a as $key => $b) {
    echo $b.$a[$key+1].$a[$key+2].$a[$key+3].'<br />';
}
...