Kjapp og trygg hosting for Wordpress

Kombinasjon av tall/bokstaver i PHP

Shopping-guiden

New Member
Hei,

Jeg skulle gjerne ha funnet en måte å finne alle mulige kombinasjoner av for eksempel bokstavene og tallene "abc123" i PHP.

Det skal alltid være 6 tall i kombinasjonen.

Samme tall/bokstav kan alltid komme etter hverandre.(aaaaaa / ab123c / bb32aa /3bc12a er alle greie kombinasjoner)

Noen som kan hjelpe meg med dette?
 
Sist redigert:

adeneo

Medlem
Det du prøver å gjøre kalles permutering, og det er flere formler for dette alt ettersom hvordan man ønsker å gjøre det, og hva som tillates i resultatet.

Det virker som du er ute en standard permuteringsdings i kode, og den vanligste måten å gjøre det på i omtrent alle språk er med det som kalles "iterations", altså å gå gjennom tegn for tegn og generere alle tenkelige muligheter av de tegnene som forekommer i strengen.

Noe sånt burde gjøre dette:

PHP:
<?php
    $chars  = str_split('abc123');
    $length = count($chars);
    
    for ($a = 0; $a <= $length-1; $a++) {
        for ($b = 0; $b <= $length-1; $b++) {
            for ($c = 0; $c <= $length-1; $c++) {
                for ($d = 0; $d <= $length-1; $d++) {
                    for ($e = 0; $e <= $length-1; $e++) {
                        for ($f = 0; $f <= $length-1; $f++) {
                            echo $chars[$a].$chars[$b].$chars[$c].$chars[$d].$chars[$e].$chars[$f]."<br>";
                        }
                    }
                }
            }
        }
    }
?>
Så får du eventuelt finne ut om du trenger begrensninger av resultatet utover dette osv.
 

Pong

Jeg selger sʇɥƃıluʍop :)
Og etterhvert finner man ut at det må være en enklere måte enn å skrive disse 'nestede' loops, og da får du en løsning med rekursivitet.
Det fikser du adeneo vel på en blunk også - følg med Shopping-guiden ;)
 

typisk

Utvikler
Lenge siden jeg har sett 5 for loops før. Her løser du det rekursivt.
PHP:
function permutasjon($str,$i,$n) {
   if ($i == $n) //basecase
       print "$str\n";
   else {
        for ($j = $i; $j < $n; $j++) {
          swap($str,$i,$j);
          permutasjon($str, $i+1, $n);
          swap($str,$i,$j);
       }
   }
}

// swapper char på pos $i og $j av $str.
function swap(&$str,$i,$j) {
    $temp = $str[$i];
    $str[$i] = $str[$j];
    $str[$j] = $temp;
}   

$str = "abc123";
permutasjon($str,0,strlen($str));
 

adeneo

Medlem
Og etterhvert finner man ut at det må være en enklere måte enn å skrive disse 'nestede' loops

Jeg er i grunn ikke spesielt god på PHP, men etter min mening finnes det ingen "enklere" måte å skrive det på enn nestede loops, i hvert fall hvis man tenker på lesbarhet og hvor enkelt det er å forstå hva som egentlig foregår hvis man ikke har noe særlig erfaring med koding.
Nå gjelder selvfølgelig det for seks tegn, hadde det vært tredve så hadde det vært litt annerledes og rimelig unødvendig med 30 for loops, men det var fortsatt et enkelt eksempel som er lett å forstå!

Lenge siden jeg har sett 5 for loops før.

Det var faktisk seks :mad:

Kunne man ikke like gjerne gjort det slik i stedet for å bruke to funksjoner:

PHP:
function permutasjon($str, $permuteringer = array()) {
        if (strlen($str) < 2) {return array($str);}
        $tail = substr($str, 1);
        foreach (permutasjon($tail) as $permutering) {
            $length = strlen($permutering);
            for ($i = 0; $i <= $length; $i++) {
                $permuteringer[] = substr($permutering, 0, $i) . $str[0] . substr($permutering, $i);
            }
        }
        return $permuteringer; //returnerer et array med permutasjoner
    }


    $str = "abc123"; 
    $permut = permutasjon($str);

    foreach ($permut as $permutasjon) {
        echo $permutasjon."<br>";
    }

Selv om resultatet egentlig ikke blir det som trådstarter ønsker, i hvert fall slik jeg har forstått det?
 
Sist redigert:

adeneo

Medlem
Prøver et eksempel til, med en annen måte å gjøre det på?

PHP:
function Permutasjon($dybde, &$ut, $p="") {
    global $str;
    for($i = 0; $i < strlen($str); $i++) {
        $currPerm = $p.$str[$i];
        if($dybde > 1) {
            Permutasjon($dybde - 1, $ut, $currPerm);
        }else{
            $ut.= $currPerm."<br>";
        }
    }
}
    
$str = "abc123";
Permutasjon(strlen($str), $out);
echo $out;
 
Topp