Avatar billede Kengun Praktikant
01. september 2002 - 21:30 Der er 18 kommentarer og
1 løsning

PHP kjenner ikke alfabetet :-)

Jepp, jeg har funnet ut at PHP ikke kan alfabetet :) Den sorterer utmerket med bokstaver fra A til Z men de nordiske bokstavene Æ Ø Å sorteres feil. PHP sortere de slik Å Æ Ø. Og det er jo feil :)

Jeg bruker følgende kode:

<?php
$filarray = file("data.txt");
sort($filarray);
$ny_filarray = implode("", $filarray);

$file = fopen("data.txt", "w");
fwrite($file, $ny_filarray);
fclose($file);

?>

Er det noen som kan hjelpe meg å lære PHP alfabetet? Det ville også være fint hvis jeg kan få et script der den ikke skiller på store og små bokstaver. PS! Jeg søker koden/scriptet og ikke noen linker.
Avatar billede Slettet bruger
01. september 2002 - 21:37 #1
Du skal bruge usort-funktionen:
http://www.php.net/manual/en/function.usort.php
Jeg ville godt kunne bikse noget sammen, men der er garanteret en anden, der kan gøre det smartere end mig, så jeg venter lige lidt! :)
Avatar billede angelod Novice
01. september 2002 - 21:41 #2
Det var også min første tanke, men jeg har desværre ikke lige tid til at skrive noget lige nu, da jeg sidder med noget selv. :o)
Avatar billede Kengun Praktikant
02. september 2002 - 11:58 #3
ingen der klarer at få dette til at fungere?
Avatar billede jakoba Nybegynder
02. september 2002 - 13:18 #4
Det ser ud til at det alfabet du bruger er ISO latin 8879  hvor bogstavkoderne for æ,ø og å er tildelt i en rækkefølge der vil give det resultat.

du kan se række følgen på diverse specielle nationale bogstaver her:
http://hjem.get2net.dk/Jakob.Aggernaes/htisolat.html

med phoenixv's bruger definerede sortering 'usort' kan du lave en sammenligningsfunktion for strenge:


function dincompare( $a, $b ) {
        // compare 2 strings encoded with 8-bit characters according
        // to a predefined ordering rule
    static $alfabet = array(
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  // kontrolbogstaver
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  // kontrolbogstaver
    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  //
    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,  // a-z => A-Z
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
    128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
    144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
    160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
    176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
    192,193,194,195,196,302,300,199,200,201,202,203,204,205,206,207,  // Å => 302, Æ => 300
    208,209,210,211,212,213,214,215,301,217,218,219,220,221,222,223,  // Ø => 301
    224,225,226,227,228,302,300,231,232,233,234,235,236,237,238,239,  // Å => 302, Æ => 300
    240,241,242,243,244,245,246,247,301,249,250,251,252,253,254,255  // Ø => 301
                            );
        // $alfabet definerer en vægt for hvert bogstav
        // i alfabetet ISO latin 8879.

    $lgt = min( strlen($a), strlen($b) ):
    for ( $i = 0; $i < $lgt; $i++ )
        if  $alfabet[ ord( $a[$i] ) ] != $alfabet[ ord( $b[$i] ) ] ) break;

    if ( $i == $lgt ) {
            // reached end of either string. order by length
        $res =  strlen($a) - strlen($b);
    } else {
            // reached different letters. order by alfabet veight
        $res = $alfabet[ ord( $a[$i] ) ] - $alfabet[ ord( $b[$i] );
    }
    if ( $res > 0 ) return 1;  // $a > $b
    if ( $res == 0 ) return 0;  // $a == $b
    return -1;                  // $a < $b
} //endfunction dincompare

//du kan nu sortere dit array af strenge med:

usort( $ditarray, "dincompare" );

men nu vi er igang bør svensk ö og dansk ø vel egentlig sorteres med samme vægt.
og de andre specialbogstaver skal vel også have en mere 'korrekt' vægt.

mvh JakobA
Avatar billede Kengun Praktikant
04. september 2002 - 14:12 #5
Hmmm, tusen takk for svar Jakob :). Men jeg er ingen PHP haj og skulle svært gerne fået scriptet implementeret inn i mitt eksisterende script........ Hvis nogen kan gøre det, så er der mere points at hente....
Avatar billede nikolajdu Nybegynder
04. september 2002 - 16:30 #6
Fy for en bare for at sortere efter æøå - Jojo jeg har samme problem :)
Avatar billede jakoba Nybegynder
04. september 2002 - 17:10 #7
ok, det er småting. bare vent til du skal sortere adresser eller bogtitler. Så kan du komme ud for at
  'st.' == 'sankt'      ( 'St. Nikolajdu Plads' )
  'st.' == 'store'      ( 'st. Kongengade' )
  'st.' == 'station'    ( 'Østerport st.' )
og de skal så sorteres efter det uforkortede ord på basis af hvad der ellers står i adressen eller titlen.

kengun >> zip php-scriptet og læg et link, så kikker jeg på det. Husk at fortælle hvad det er der skal sorteres og hvornår :-)

mvh JakobA
Avatar billede Kengun Praktikant
06. september 2002 - 07:06 #8
Jeg har et kommaseparert text dokument (data.txt) som ser omtrent slik ut:

Kenneth Gundersen, epost@adresse.no, www.kengun.com, Norge
Ola Normann, ola@normann, www.olanormann.no. Norge
osv. osv.

Dernest bruker jeg dette scriptet for at sortere det hele:

<?php
$filarray = file("data.txt");
sort($filarray);
$ny_filarray = implode("", $filarray);

$file = fopen("data.txt", "w");
fwrite($file, $ny_filarray);
fclose($file);
?>

Det er det hele :)
Avatar billede Kengun Praktikant
06. september 2002 - 07:10 #9
Det hele er i bruk på min webside www.kengun.com (klikk på "Lokale epostadresser" fra menyen). Når man legger inn en ny epostadresse så benyttes ovenstående script for å sortere. Men som du ser i listen så kommer Å før Ø :)
Avatar billede jakoba Nybegynder
06. september 2002 - 10:19 #10
Det er blot linien  sort($filarray);  der skal udskiftes:

<?php
$filarray = file("data.txt");
// sort($filarray);    // denne linie fjernes
//                        og erstattes med:

function dincompare( $a, $b ) {
        // compare 2 strings encoded with 8-bit characters according
        // to a predefined ordering rule
    static $alfabet = array(
      0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,  // kontrolbogstaver
    16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  // kontrolbogstaver
    32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  //
    48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
    64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
    96, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,  // a-z => A-Z
    80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,123,124,125,126,127,
    128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
    144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
    160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
    176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
    192,193,194,195,196,302,300,199,200,201,202,203,204,205,206,207,  // Å => 302, Æ => 300
    208,209,210,211,212,213,214,215,301,217,218,219,220,221,222,223,  // Ø => 301
    224,225,226,227,228,302,300,231,232,233,234,235,236,237,238,239,  // Å => 302, Æ => 300
    240,241,242,243,244,245,246,247,301,249,250,251,252,253,254,255  // Ø => 301
                            );
        // $alfabet definerer en vægt for hvert bogstav
        // i alfabetet ISO latin 8879.

    $lgt = min( strlen($a), strlen($b) ):
    for ( $i = 0; $i < $lgt; $i++ )
        if  $alfabet[ ord( $a[$i] ) ] != $alfabet[ ord( $b[$i] ) ] ) break;

    if ( $i == $lgt ) {
            // reached end of either string. order by length
        $res =  strlen($a) - strlen($b);
    } else {
            // reached different letters. order by alfabet veight
        $res = $alfabet[ ord( $a[$i] ) ] - $alfabet[ ord( $b[$i] );
    }
    if ( $res > 0 ) return 1;  // $a > $b
    if ( $res == 0 ) return 0;  // $a == $b
    return -1;                  // $a < $b
} //endfunction dincompare

    //du kan nu sortere dit array af strenge med:
usort( $filarray, "dincompare" );

$ny_filarray = implode("", $filarray);

$file = fopen("data.txt", "w");
fwrite($file, $ny_filarray);
fclose($file);
?>

mvh JakobA
Avatar billede Kengun Praktikant
06. september 2002 - 20:15 #11
Her ligger testlisten data.txt - http://www.kengun.com/eksperten/data.txt
Her ligger sorteringsscriptet - http://www.kengun.com/eksperten/sorter.php

Når du kjører sorter scriptet så giver det feil.....
Linje 30>    $lgt = min( strlen($a), strlen($b) ):
Avatar billede jakoba Nybegynder
06. september 2002 - 20:20 #12
Det er fordi den linie skal afsluttes med en ; (semikolon) og ikke et : (kolon)

der er også en fejl i denne linie:
        $res = $alfabet[ ord( $a[$i] ) ] - $alfabet[ ord( $b[$i] );
der skal stå:
        $res = $alfabet[ ord( $a[$i] ) ] - $alfabet[ ord( $b[$i] ) ];
så der er balance i klammerne

mvh JakobA
Avatar billede Kengun Praktikant
06. september 2002 - 21:07 #13
Fremdeles feil *s* Nå er det i linje 32:
if  $alfabet[ ord( $a[$i] ) ] != $alfabet[ ord( $b[$i] ) ] ) break;
Avatar billede jakoba Nybegynder
06. september 2002 - 21:24 #14
jep, skal være:
  if ( $alfabet[ ord( $a[$i] ) ] != $alfabet[ ord( $b[$i] ) ] ) break;
Avatar billede Kengun Praktikant
06. september 2002 - 22:51 #15
DER var den :) Listen ble nå sorteret riktig :)
http://www.kengun.com/eksperten/data.txt
Avatar billede Kengun Praktikant
06. september 2002 - 22:52 #16
Har lige øket points fra 30 til 60, så har du lidt for alt arbeidet :)
Avatar billede jakoba Nybegynder
06. september 2002 - 22:59 #17
takker :-)
Avatar billede Kengun Praktikant
06. september 2002 - 23:01 #18
Hurra! Nå kan PHP alfabetet, takket være Jakob :) Scriptet er nå i bruk på min hovedside www.kengun.com ("Lokale Epostadresser")
Avatar billede Kengun Praktikant
06. september 2002 - 23:02 #19
Jakob> Selv takk :)
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