Avatar billede jrr Nybegynder
26. september 2005 - 01:03 Der er 11 kommentarer og
1 løsning

Hjælp til fi beregning

Hej Eksperter

Jeg sider med et lille problem, jeg har lavet en funktion der beregner fi koden, og det seer ud til at virke undtaget når talet  $mod1 (se kode) bliver 0, så bliver check cifret 10 og der er jo ikke så heldigt, er der nogen der kan gennemskue dette, eller er hele koden forkert....

function cif($len)
{
    if (strlen($len) > 1)
    {   
        $len1 = substr($len, 0, 1);
        $len2 = substr($len, 1, 1);
        $cif = $len1 + $len2;
        return $cif;
    }
    else
    {
    return $len;
    }
}
function regn($tlf, $id)
{

    $tal = $tlf . $id;
    $i = 0;
    //echo strlen($tal);
    //$tal_liste[array()];
    while($i < strlen($tal))
    {
        $tal_liste[] = substr($tal, $i, 1);
        $i+=1;
    }
    $tal1[] = cif($tal_liste[0]);
    $tal1[] = cif(2*$tal_liste[1]);
    $tal1[] = cif($tal_liste[2]);
    $tal1[] = cif(2*$tal_liste[3]);
    $tal1[] = cif($tal_liste[4]);
    $tal1[] = cif(2*$tal_liste[5]);
    $tal1[] = cif($tal_liste[6]);
    $tal1[] = cif(2*$tal_liste[7]);
    $tal1[] = cif($tal_liste[8]);
    $tal1[] = cif(2*$tal_liste[9]);
    $tal1[] = cif($tal_liste[10]);
    $tal1[] = cif(2*$tal_liste[11]);
    $tal1[] = cif($tal_liste[12]);
    $tal1[] = cif(2*$tal_liste[13]);

    $mod = $tal1[0] + $tal1[1] + $tal1[2] + $tal1[3] + $tal1[4] + $tal1[5] + $tal1[6] + $tal1[7] + $tal1[8] + $tal1[9] + $tal1[10] + $tal1[11] + $tal1[12] + $tal1[13];

    $mod1 = $mod % 10;
    $mod2 = 10 - $mod1;
    $tal1[14] = $mod2;
    $fi = ">+71<" .$tlf . $id . $tal1[14] . "+84527092<";

    return $fi;
}
Avatar billede jrr Nybegynder
26. september 2005 - 01:07 #1
$telefon ="98624289";
$id = "000014"
regn($telefon, $id);
det giver >+71<9862428900001410+84527092<
Hvilket er 1 cifre for meget :-(
Avatar billede coderdk Praktikant
26. september 2005 - 01:28 #2
Vil det ikke virke med:

$mod2 = ( 10 - $mod1 ) % 10;

?
Avatar billede jrr Nybegynder
26. september 2005 - 01:40 #3
desvære ikke prøvede med :
$telefon ="98624289";
$id = "000015"
regn($telefon, $id);
>+71<98624289000015-3+84527092<
men jeg tror heller ikke den går da der bliver lavet om på rækkefølgen af beregningerne (jeg tror også der er en lille fejl i din kode hvis jeg ikke tager fejl det skulle vist være $mod2 = ( 10 - $mod ) % 10;
Avatar billede coderdk Praktikant
26. september 2005 - 01:45 #4
Nææh jeg mente nu det jeg skrev :) Men hvis det ikke virker, sååå :)

For øvrigt:

    $tal = $tlf . $id;
    $i = 0;
    //echo strlen($tal);
    //$tal_liste[array()];
    while($i < strlen($tal))
    {
        $tal_liste[] = substr($tal, $i, 1);
        $i+=1;
    }

Kan skrives sådan:

  $tal_liste = preg_split('//', $tlf . $id, -1, PREG_SPLIT_NO_EMPTY);

Og

  $mod = $tal1[0] + $tal1[1] + $tal1[2] + $tal1[3] + $tal1[4] + $tal1[5] + $tal1[6] + $tal1[7] + $tal1[8] + $tal1[9] + $tal1[10] + $tal1[11] + $tal1[12] + $tal1[13];

Kan skrives:

  $mod = array_sum( $tal1 );

Og dette

    $tal1[] = cif($tal_liste[0]);
    $tal1[] = cif(2*$tal_liste[1]);
    $tal1[] = cif($tal_liste[2]);
    $tal1[] = cif(2*$tal_liste[3]);
    $tal1[] = cif($tal_liste[4]);
    $tal1[] = cif(2*$tal_liste[5]);
    $tal1[] = cif($tal_liste[6]);
    $tal1[] = cif(2*$tal_liste[7]);
    $tal1[] = cif($tal_liste[8]);
    $tal1[] = cif(2*$tal_liste[9]);
    $tal1[] = cif($tal_liste[10]);
    $tal1[] = cif(2*$tal_liste[11]);
    $tal1[] = cif($tal_liste[12]);
    $tal1[] = cif(2*$tal_liste[13]);
   
Kan vist skrives:

    $c = 0;
    $tal1 = array();
    foreach ( $tal_liste as $tal )
    {
        $tal1[] = cif( ( $c + 1 ) * $tal );
        c++;
        $c %= 2;
    }

Hvis ikke jeg tager meget fejl ;)
Avatar billede coderdk Praktikant
26. september 2005 - 01:46 #5
Noget helt andet er, at jeg er for træt til at forstå logikken i den formel, der :)
Avatar billede jrr Nybegynder
26. september 2005 - 01:53 #6
jeg er også på vej i seng, jeg tror jeg har fundet løsningen, mewn kikker på det i morgenen, det ser ud til at når $mod1 bliver 0 bliver cifret 10 men det skal bare være 0 når det bliver 10 (jeg har tjekket det med 3 eksisterende fi kort og det ser ud til at passe.
her er linket til formelen http://www.sj-compute.dk/fi71.pdf
jeg kikker vidre på det i morgen.
indtil vidre tak for hjælpen... :-)
Avatar billede coderdk Praktikant
26. september 2005 - 12:25 #7
Ja, men var det ikke det jeg skrev:

    $mod1 = $mod % 10;
    $mod2 = ( 10 - $mod1 ) % 10;

?
Avatar billede jrr Nybegynder
26. september 2005 - 15:17 #8
jeg har prøvet at sætte det hele ind, og det ser ud til at virke, jeg er dog ikke helt med på hvad den gør og det bekømre mig da det ser ud til at der bliver modulus 10 2 gange, jeg har tjekket det ved at køre et par betalinger og den brokker sig ikke, så det må virke. smid svar og så er der point...

Takker for hjælpen
Avatar billede coderdk Praktikant
26. september 2005 - 16:07 #9
Så lidt :) Ja, der bliver modulo 10 to gange, men den sidste bliver jo kun brugt hvis $mod1 er 0 og $mod2 så ellers ville blive 10 ;)
Hvis der er noget du gerne vil have forklaret siger du bare til, så skal jeg med glæde være der :)
Avatar billede jrr Nybegynder
26. september 2005 - 22:33 #10
jeg er ikke helt med hvorfor den kun bliver brugt hvis $mod1 er 0, så en lille forklaring ville jeg gerne have, men den haster ikke da jeg ikke kommer til at arbejde med det´før end i morgen.
Avatar billede coderdk Praktikant
26. september 2005 - 23:17 #11
Well, den bliver brugt uanset hvad, men da $mod1 jo kun kan være 0-10 så vil den kun "træde i kraft" når den er 10 :) Modulo er jo resten af en heltalsdivision ;)
Avatar billede jrr Nybegynder
27. september 2005 - 08:10 #12
ja selvfølig 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