Avatar billede thomasclausen Nybegynder
22. september 2008 - 11:40 Der er 5 kommentarer

txt-fil som pris database

Hej Eksperter

Jeg har lavet en simpel funktion som åbner en txt-fil med varenumre og priser og ud fra et givent varenummer indsættes prisen. Det fungerer egentlig fint, men i det øjeblik at der kommer mange varenumre, så begynder det at gå langsomt med at hente priserne ind.

Selve funktionen ser sådan her ud:
function getPricestkmedmoms($no) {
    $filename = "priserstkmedmoms.web";
    $filehandle = fopen($filename, "r");
    while(!feof($filehandle)) {
        $line = fgets($filehandle, filesize($filename));
        list($key, $value) = split("\|",$line);
        $array[$key] = $value;
    }
    fclose($filehandle);
    echo $array[$no];
}

Selve pris-filen er der et udsnit af her:
2685|570,00
2690|240,00
2695|570,00
2710|235,00
2730|235,00
2740|375,00
2743|355,00
2744|100,00
2745|885,00

Jeg ved godt at det er uhensigtsmæssigt at jeg åbner og lukker filen hver gang der skal indsættes en pris, men har ikke kunne løse problemet på andre måder.

Har bl.a. prøvet nedenstående for at undgå at åbne og lukke filen hele tiden:
$filename = "prisermedmoms.web";
$filehandle = fopen($filename, "r");
$price = array ();
while(!feof($filehandle)) {
    $line = fgets($filehandle, filesize($filename));
    list($key, $value) = split("\|",$line);
    $price[$key] = $value;
}
fclose($filehandle);

function getPricemedmoms($no) {
    echo $price[$no];
}

Men der indsættes der slet ikke nogle priser!

Håber der er nogen der har lidt mere forstand på det her end jeg har og kan hjælpe mig.
Avatar billede expnet Seniormester
22. september 2008 - 11:44 #1
function getPricestkmedmoms($no) {
->    $filename = "priserstkmedmoms.web";

-> $filename = "prisermedmoms.web";

de er ikke ens skal de ikke være det???
Avatar billede thomasclausen Nybegynder
22. september 2008 - 11:59 #2
Hej expnet

Jo beklager forviringen, men det er fordi jeg har lavet 2 forskellige funktioner, så det er fra to forskellige funktioner, men priserne indsættes stadigvæk ikke ved den sidste.
Avatar billede showsource Seniormester
22. september 2008 - 12:22 #3
Går det langsomt eller kan du ikke indsætte?
Umiddelbart er der ingen kode som indsætter i filen?
Og for at bruge $price array'et inde i funktionen, skal den gøres global

function getPricemedmoms($no) {
global $price;
    echo $price[$no];
}

En anden måde at hente ud på:

<?php

$price = array();

$priser = file("prisermedmoms.web");

for($i = 0; $i < count($priser); $i++) {

$priser[$i] = trim($priser[$i]); // Fjerner "om luft" og linieksift.

$delop = strpos($priser[$i], "|"); // Finder |

$price[substr($priser[$i],  0, $delop)] = substr($priser[$i], ($delop+1), strlen($priser[$i]));

}

print_r($price);

?>
Avatar billede thomasclausen Nybegynder
22. september 2008 - 13:00 #4
Hej showsource

Det var fordi at med mit første eksempel kørte det langsomt og det andet eksempel ville ikke indsatte noget.
Selve koden der indsætter den rigtige pris ser eks. sådan her ud:
<? getPricestkmedmoms('2710') ?>

Men det med at bruge "global $price;" virker - fantastisk!

Med hensyn til din anden metode, ved du så om der er nogen forskel i hastigheden mellem de to måder at gøre det på eller er det så lidt at det er ligegyldigt?

Uanset hvad, så send et svar så du kan få nogle point.
Avatar billede showsource Seniormester
23. september 2008 - 20:34 #5
file() gir dig et array
En for-løkke er vist hurtigere end while
strpos() er vist hurtigere end explode

Men jeg har ikke selv testet noget !
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