Avatar billede lojmann Nybegynder
29. september 2006 - 21:43 Der er 8 kommentarer og
2 løsninger

Generer alle muligheder ud fra en streng

Det jeg ønsker, er at generer alle muligheder af en string, med alle bogstaver fra a-z, 0-9 samt - og _ (dash + underscore). (ikke store og små bogstaver, blot små!)

Begrænsningen af stringens længde skal kunne angives som f.eks. et argument til en funktion eller blot som en variabel.

Jeg har fundet noget kode, men den generer ikke alle muligheder, f.eks. laver de ikke aa, ba etc. etc.

<code>
<?
    // view the real output
    header('Content-Type: text/plain');

    // your string
    $letters = 'abcdefghijklmnopqrstuvwxyz0123456789-_';

    // convert to array
    $letters_array = str_2_array($letters);
    echo 'The number of two charcter combinations from that string is '.count($result = get_combos($letters_array, 2))."\n\n";
    echo 'The following is the combinations array'."\n\n";
    print_r(array_2d_to_1d($result));

    function get_combos($input, $combo_length) {
        $input = array_values($input);
        $code = '';
        $cnt = count($input);
        $ret = array();
        $i0 = -1;
        for($i=0;$i<$combo_length;++$i) {
            $k = 'i'.($i+1);
            $code .= 'for($'.$k.'=$i'.$i.'+1; $'.$k.'< $cnt-'.($combo_length-$i-1).'; ++$'.$k.') ';
        }
        $code .= '$ret[] = array($input[$i'.implode('], $input[$i',range(1,$combo_length)).']);';
        eval($code);
        return $ret;
    }
   
    function str_2_array($input) {
        for($i = 0, $len = strlen($input); $i < $len; $i++) {
            $rtn[] = $input[$i];
        }
        return $rtn;
    }
   
    function array_2d_to_1d($input) {
        foreach($input as $key => $value) {
            $rtn[$key] = implode($value);
        }
        return $rtn;
    }
?>
</code>

Nogle der har erfaring med det, kan hjælpe eller lign.

/Thomas
Avatar billede coderdk Praktikant
30. september 2006 - 00:45 #1
Du er i virkeligheden bare ved at lave et talsystem, som f.eks. hexadecimal...
Her er et eksempel på hvordan det kan gøres:

<?php

    $letters = '0123456789abcdefghijklmnopqrstuvwxyz-_';
    $base = strlen( $letters );
   
    $maxStrLen = 4;
   
    function convertBase10( $num )
    {
        global $base;
        global $letters;
        if ( $num < $base )
        {
            return $letters[$num];
        }
        else
        {
            return convertBase10( floor( $num / $base ) ) . $letters[$num % $base];
        }
    }

    $tmp = '';
    $n = 0;
    while ( strlen( $tmp ) < $maxStrLen )
    {
        $tmp = convertBase10( $n );
        print "$n: $tmp<br>\n";
        flush();
        $n++;
    }
 
?>
Avatar billede coderdk Praktikant
30. september 2006 - 00:47 #2
(i.e. hvis du ændrer $letters til '01' så skriver den binær, '01234567' = octal og '0123456789abcdef' = hexadecimal)
Avatar billede drbean Nybegynder
30. september 2006 - 09:18 #3
Jeg kender lojmann privat, og vi snakkede sammen i går aftes. jeg lavede denne løsning på hans problem, og det ser ud til at virke.

<?php
$letters = 'abcdefghijklmnopqrstuvwxyz0123456789-_';

$a1 =  str_2_array($letters);
$aCount = array();
$len = 5;

$aCount[0] = 0;

for($i=0;$i<= pow(count($a1),$len);$i++)
{
    echo '<br />';
    //print_r($aCount);
   
    $strTemp = "";
    for($x = 0; $x < count($aCount);$x++)
    {
        $strTemp .= $a1[$aCount[$x]];
    }
   
    for($x = 0; $x < count($aCount) ;$x++)
    {
       
        if($aCount[$x] == 37)
        {
            if($x == 0)
            {
                $aCount[count($aCount)] = 0;
                $aCount[$x] = 0;
                $x=99999;
            }
            else
            {
                $aCount[$x] = 0;
                $aCount[$x-1]=$aCount[$x-1] + 1;               
            }           
        }
        elseif(count($aCount) == $x+1)
        {
            $aCount[$x]++;   
        }
    }   
    echo $strTemp;   
}

function str_2_array($input)
{
        for($i = 0, $len = strlen($input); $i < $len; $i++)
    {
            $rtn[] = $input[$i];
        }
        return $rtn;
    }
   


?>
Avatar billede coderdk Praktikant
30. september 2006 - 12:48 #4
Det ser meget besværligt og forvirrende ud :)
Avatar billede lojmann Nybegynder
30. september 2006 - 12:52 #5
drbear: Smid et svar, så kan i dele point :)

Jeg har rettet i svritet, så det tjekker om det starter/slutter med et dash eller underscort (-_) og fået den til at ligge det hele i SQL... Tak for jeres bud, det er super
Avatar billede drbean Nybegynder
30. september 2006 - 16:17 #6
coderdk: det er som man tager det. Har lavet det på lidt over en time, en fredag aften. Det kunne være lavet pænere det giver jeg dig ret i.

Lojmann: jeg samler ikke på point. Behold dem selv. ;-)
Avatar billede coderdk Praktikant
30. september 2006 - 16:32 #7
drbean, :) Hey hvis det virker, er det jo som det skal være! :)
Avatar billede lojmann Nybegynder
30. september 2006 - 16:58 #8
takker...
Avatar billede lojmann Nybegynder
30. september 2006 - 16:58 #9
luk
Avatar billede coderdk Praktikant
30. september 2006 - 17:11 #10
hehe takker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester