Avatar billede alvion Nybegynder
07. april 2003 - 22:05 Der er 8 kommentarer og
1 løsning

Kode optimering

Jeg arbejder med et datasæt, der i sin form gemmes efter følgende princip:

n=1,k=carsten gehling,i=31
foo=bar,k=5,i=6,cpr=191171-xxxx
w=7,u=8

Dvs. en slags kommasepareret fil. Hver linie (=1 post)består af et (vilkårligt) antal felter, adskilt af komma. Disse felter indeholder så igen to værdier: en nøgle og en værdi. Nøglen er altid unik på den enkelte linie.

Dette datasæt skal indlæses og fortolkes til et array med følgende struktur (lavet med print_r()):

Array
(
    [0] => Array
        (
            [n] => 1
            [k] => carsten gehling
            [i] => 31
        )

    [1] => Array
        (
            [foo] => bar
            [k] => 5
            [i] => 6
            [cpr] => 191171-xxxx
        )

    [2] => Array
        (
            [w] => 7
            [u] => 8
        )

)

Jeg har lavet nedenstående to funktioner til henholdsvis at konvertere fra tekst formatet til array strukturen og vice versa. Jeg har dog på fornemmelsen, at begge måske kan optimeres, men min trætte hjerne kan ikke komme på noget fornuftigt svar.

Så spørgsmålet er: Kan koden optimeres?

// String => Array
function list_fieldlist_extract($s) {
    $fieldarray = array();
    foreach (explode("\n", $s) as $line ) {
        $field = array();
        foreach (explode(",", $line) as $col) {
            $c = split("=", $col);
            $field[$c[0]] = $c[1];
        }
        $fieldarray[] = $field;
    }
    return $fieldarray;
}

// Array => String
function list_fieldlist_pack($fieldarray) {
    $lines = array();
    foreach ($fieldarray as $field) {
        $line = array();
        foreach ($field as $k => $v)
            $line[] = "$k=$v";
        $lines[] = join(",", $line);
    }
    return join("\n", $lines);
}
Avatar billede tipsen Nybegynder
07. april 2003 - 23:21 #1
Det du søger er vel egentlig bare en "smart" måde at lagre et array på? Hvis det er tilfældet, behøver du ikke opfinde den dybe tallerken endnu engang!

$testarray = array('key1' => 42, 'key2' => 'Bartols Golub');

// Array => String
$SerializedString = serialize($testarray);

// Udskriv streng-repræsentation af array:
echo $SerializedString;

// String => Array
$LoadedArray = unserialize($SerializedString);
Avatar billede tipsen Nybegynder
07. april 2003 - 23:34 #2
Eller måske endda fgetcsv(): http://dk.php.net/manual/en/function.fgetcsv.php
Avatar billede alvion Nybegynder
07. april 2003 - 23:49 #3
Nej jeg vil netop ikke bruge (un)serialize. Kravene for formatet er:

1) Det skal være sprog-uafhængigt
2) Det skal være nemt at redigere "i hånden"

Formatet er fint nok, og ovenstående kode fungerer fint - det var blot om jeg var sprunget over hvor åen var dybest...
Avatar billede alvion Nybegynder
07. april 2003 - 23:50 #4
fgetcsv() duer heller ikke. Mine data ligger ikke i en fil ;-)
Avatar billede tipsen Nybegynder
08. april 2003 - 00:08 #5
OK - jeg kigger på det i morgen - der er nogle småting der kan forbedres, så vidt jeg kan se - mener forøvrigt der er en fejl i den ene funktion - vender tilbage...
Avatar billede alvion Nybegynder
08. april 2003 - 00:20 #6
Thnx
Avatar billede sone Nybegynder
08. april 2003 - 10:04 #7
serialize er absolut det hurtigste - hvis du kan anvende det.
Hvis du selv skriver funktioner, så er explode hurtigere end split.
Avatar billede tipsen Nybegynder
08. april 2003 - 11:25 #8
Måske kan du bruge noget herfra:

// String => Array
function list_fieldlist_extract($s) {
    $fieldarray = array();
    foreach (explode("\n", $s) as $line ) {
        $field = array();
        foreach (explode(',', $line) as $item) {
            $c = sscanf($item, '%s=%s', $key, $val);
            $field[$key] = $val;
        }
        $fieldarray[] = $field;
    }
    return $fieldarray;
}

// Array => String
function list_fieldlist_pack($fieldarray) {
    $line = '';
    foreach ($fieldarray as $field) {
        while(list($key, $val) = each($field)) {
            $line .= $key . '=' . $val . ',';
        }
        $line .= "\n";
    }
    return substr($line, 0, -1);
}

Jeg går udfra du har et stort datasæt du kan teste på for at se om det er hurtigere...
Avatar billede alvion Nybegynder
19. februar 2004 - 01:29 #9
tipsen -> Det hjalp faktisk lidt... :)

Det jeg primært søgte var, om antallet af kode-linier kunne reduceres, men det kunne du jo ikke vide. Så pointene er dine.
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