Avatar billede walden Nybegynder
03. november 2005 - 17:06 Der er 8 kommentarer og
1 løsning

tælle funktion

Jeg har liste liste over navne i en txt-fil. Listen ser fx. sådan ud:

Peter Olesen
Lotte Olesen
Svend Olesen
Hanne Olesen
Hanne Olesen
Peter Olesen
Peter Olesen
Lotte Svendsen
Poul Svendsen

Er der en, der vil hjælpe mig med at lave en funktion, der tæller hvor mange gange et bestemt navn (Peter Olesen) forekommer (3), og skriver det ud som:

"Peter Olesen forekommer 3 gange" ?
Avatar billede hmortensen Nybegynder
03. november 2005 - 17:39 #1
function tael_person($fil, $navn)
{
  $i = 0;
  $indhold = file($fil);
  foreach ($indhold as $person)
  {
    if ($person == $navn)
      $i++;
  }
  return $i;
}
$fil = "personer.txt";
$navn = "Peter Olesen";
echo $navn." forekommer ".tael_person($fil, $navn)." gange.";
Avatar billede bromer Nybegynder
03. november 2005 - 17:39 #2
Hvis du har dine linjer i en fil kaldet "countdata.txt", kan du benytte følgende:

<?php
$lines = file('countdata.txt');

$count = array();
foreach($lines as $line) {
        $count[trim($line)]++;
}
?>

derefter kan du printe antallet af gange navnet forekom ved at benytte navnet som indeks i array'et som her:

<?php
printf("Navnet Peter Olesen forekommer %d gange\n\n",$count['Peter Olesen']);
?>
Avatar billede walden Nybegynder
03. november 2005 - 18:33 #3
Hej og tak til jer begge for de hurtige svar.

Jeg kan fint få bromers svar til at virke ... men det kniber lidt med hmortensens. Jeg synes ellers også den kode ser meget logisk og rigtig ud. Men den printer blot "Peter Olesen forekommer 0 gange"

Jeg vil gerne have hmortensens svar til at virke ogå ... har I et bud på hvad der er galt?
Avatar billede bromer Nybegynder
03. november 2005 - 18:45 #4
Tror faktisk du finde svaret i min kode. Jeg har indsat en trim() når jeg indlæser hver linje fordi file() ikke fjerne linjeskifskarakteren. Tror at følgende vil virke:

function tael_person($fil, $navn)
{
  $i = 0;
  $indhold = file($fil);
  foreach ($indhold as $person)
  {
    if (trim($person) == $navn)
      $i++;
  }
  return $i;
}
$fil = "personer.txt";
$navn = "Peter Olesen";
echo $navn." forekommer ".tael_person($fil, $navn)." gange.";
Avatar billede walden Nybegynder
03. november 2005 - 18:51 #5
Tak bromer ... det er perfekt :-)

Der er point til hmortensen også, hvis han ønsker det. Jeg kan lære noget af begge svar.
Avatar billede walden Nybegynder
03. november 2005 - 18:55 #6
Er der mon forskel den måde serveren afvikler de to scripts ... jeg tænker på hastighed (ikke fordi jeg har bemærket nogen forskel, men alligevel)?
Avatar billede bromer Nybegynder
03. november 2005 - 19:06 #7
walden: Min metode benytter en anelse mere hukommelse, hvis du kun skal slå et enkelt navn op, men fordi jeg først opbygger et array kan du slå alle navnene op bagefter i konstant tid.

Med hensyn til køretiden tror jeg de ligger meget ens, måske er min igen lidt langsomere, hvis du kun slår et navn op. Hvis du slår to eller flere navne op er min klart hurtigst da den ikke skal indlæse filen igen, men bare slå et index op i et array.
Avatar billede walden Nybegynder
03. november 2005 - 19:16 #8
Tak for de uddybende kommentarer!
Avatar billede bromer Nybegynder
03. november 2005 - 19:37 #9
Jamen, det var så lidt. Jo det vi er her for :)
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