Avatar billede walden Nybegynder
05. juni 2008 - 19:30 Der er 19 kommentarer og
1 løsning

topliste over udvalgte navne

Jeg har en txt-fil med en række navne. Jeg skriver navnene ud på en liste, hvor jeg viser de navne, der optræder flest gange i txt-filen øverst og så fremdeles.

Dertil bruger jeg dette script:

$file = file("personnavne.txt");
$b = array_count_values($file);
arsort($b);

$x = 0;
foreach ($b as $navn => $antal)
{
    if ($x < 5)
        $x++;
    else
        break;
    echo $navn." - ".$antal."<br>";
}

Listen kommer til at se sådan her ud:

Hanne Svendsen - 14
Peter Hansen - 10
Jonas Knudsen - 6
Svend Pedersen - 6
....

personnavne.txt består af en del flere navne (fx 50) og det ovenforstående script lister samtlige navne i txt-filen

Men hvis jeg nu ønsker kun at se en topliste over udvalgte navne altså fx 5 konkrete personer ud af de 50, er der så nogle, der ved, hvordan jeg gør det?
Avatar billede jakobdo Ekspert
05. juni 2008 - 21:09 #1
$x = 0;
foreach ($b as $navn => $antal)
{
    if ($x > 5)
        break;
    echo $navn." - ".$antal."<br>";
    $x++;
}

Hvad med sådan ?
Avatar billede walden Nybegynder
05. juni 2008 - 21:46 #2
Det jeg har behov for, er at lave en topliste over nogle *konkrete* navne ud af de 50 navne i personnavne.txt.

Altså fx. en rangliste over hvor mange gange Lisbeth Hansen, Ole Poulsen og Karl Johansen optræder i personnavne.txt.

Håber det er til at forstå, hvad jeg søger efter.
Avatar billede mcnovy Nybegynder
05. juni 2008 - 22:07 #3
nu kender jeg intet til php,
men de navne du ønsker at se, hvor får du dem fra..?

hvis de f.eks er i et grid view, eller lignende..
så kunne du vel lave en
foreach(//navn i gridview)
{
foreach ($navn => $antal)
{
    if ($x < 5)
        $x++;
    else
        break;
    echo $navn." - ".$antal."<br>";
}
}

som sagt, så kender jeg intet til PHP,
så ved ikke hvordan koden skal se ud, jeg gætter bare lidt..

men ideen er vel at have en foreach løkke, som kører igennem den liste af navne du vil have frem, og så tælle antallet af gange det navn kommer frem i din liste..
Avatar billede jakobdo Ekspert
05. juni 2008 - 22:15 #4
Noget ala:

$toplistenavne = array('Hanne Svendsen','Lisbeth Hansen');
$toplist = array();

foreach ($b as $navn => $antal){
    if(in_array($navn,$toplistenavne)){
        $toplist[] = $navn." - ".$antal;
    }
}

echo '<pre>';
print_r($toplist);
echo '</pre>';
Avatar billede walden Nybegynder
05. juni 2008 - 22:17 #5
De navne der skal optræde på listen er givet på forhånd.

I skal ikke hænge jer for meget i det script, jeg har vedlagt. Løsningen behøver ikke tage udgangspunkt i det. Jeg troede bare det var lettest at tilrette det, men det er ikke sikkert.
Avatar billede walden Nybegynder
05. juni 2008 - 22:27 #6
jakobdo ... jeg prøver det lige ...
Avatar billede walden Nybegynder
05. juni 2008 - 22:42 #7
Jakobdo - jeg har brugt dit eksempel sådan:

$file = file("personnavne.txt");
$b = array_count_values($file);
arsort($b);

$toplistenavne = array('Hanne Svendsen','Lisbeth Hansen');
$toplist = array();

foreach ($b as $navn => $antal){
    if(in_array($navn,$toplistenavne)){
        $toplist[] = $navn." - ".$antal;
    }
}
echo '<pre>';
print_r($toplist);
echo '</pre>';

Den skriver kun dette ud:

Array
(
)
Avatar billede jakobdo Ekspert
06. juni 2008 - 08:30 #8
Jeg har testet med de du siger du har af input data og se resultatet her: http://www.codebreaker.dk/exp/833965exp.php
Avatar billede walden Nybegynder
06. juni 2008 - 09:04 #9
Ja - det ligner lige nøjagtig det jeg går efter.

Men der må være et problem med at få puttet navnene fra personnavne.txt ind i $b.

For når jeg kobler

$file = file("personnavne.txt");
$b = array_count_values($file);
arsort($b);

på scriptet,udskriver

print_r($toplist);

kun

Array
(
)

De enkelte navne i personnavne.txt står iøvrigt på hver deres linie:

Hanne Svendsen
Hanne Svendsen
Hanne Svendsen
Lisbeth Hansen
Lisbeth Hansen
Hanne Svendsen
Peter Knudsen
Peter Knudsen
Peter Knudsen
Peter Knudsen
...
Avatar billede jakobdo Ekspert
06. juni 2008 - 09:29 #10
Har du et link til din kode ?
Kan det være det er mellemrum før eller efter navnene ?
Måske newline ?
Avatar billede walden Nybegynder
06. juni 2008 - 09:42 #11
Ja - og tak for at din hjælp:

http://www.cmdesign.dk/test/test.php
Avatar billede jakobdo Ekspert
06. juni 2008 - 09:49 #12
Det er netop lige præcis en newline der giver problemet.
Denne kode virker nu: http://www.codebreaker.dk/exp/833965exp.php
Avatar billede walden Nybegynder
06. juni 2008 - 10:11 #13
Super ... gider du lave et svar til pointene.

Det er begrænset hvad jeg kan af php, så jeg er meget taknemmelig for din hjælp.

print_r($toplist);

skriver resultatet ud med Array {} osv ... kan jeg ikke skrive listen ud uden?

PS: jeg har måske et tillægs spm ang. dette senere i dag, men så bliver det selvfølgelig med nye points ...
Avatar billede jakobdo Ekspert
06. juni 2008 - 10:35 #14
Du får et svar.

Du kan løbe det nye array igennem via:

for($i = 0; $i < count($toplist); $i++){
echo $toplist[$i] . '<br />';
}

eller:

foreach($toplist AS $elm){
echo $elm . '<br />';
}
Avatar billede walden Nybegynder
06. juni 2008 - 10:45 #15
Mange tak for hjælpen. Jeg giver det samme antal point for dette spm:

Kan jeg hente de udvalgte navne (i dette tilfælde Hanne Svendsen og Lisbeth Hansen)
fra en anden txt-fil og lægge dem ind i arrayet

fx

$udvalgte = file("udvalgte.txt");
$toplistenavne = array($udvalgte);

... har prøvet det ovenstående, men uden held.

Jeg vil gerne lave det sådan, at jeg via en formular kan tilføje de udvalte navne til udvalgt.txt ... og at det så er navnene i udvalgt.txt der bliver oprettet en særlig topliste for.

Burde det ikke kunne lade sig gøre?
Avatar billede jakobdo Ekspert
06. juni 2008 - 10:51 #16
Så skal du bare bruge:

$toplistenavne = file("udvalgte.txt", FILE_IGNORE_NEW_LINES);
Avatar billede jakobdo Ekspert
06. juni 2008 - 10:52 #17
Og takker for point.
Avatar billede walden Nybegynder
06. juni 2008 - 10:58 #18
Det er perfekt ... det var jo nok nemt tjente point :-)

Du er velkommen til at oprette et svar mere.
Avatar billede jakobdo Ekspert
06. juni 2008 - 11:02 #19
Jeg kan ikke svare flere gange.
Hvis der skal point på bordet, så skal det ske ved at du opretter et nyt spørgsmål med reference hertil og så den vej om.
Men det er lige meget nu, behold du dem bare.
Avatar billede walden Nybegynder
06. juni 2008 - 11:08 #20
Det gør jeg ellers gerne, men okay ... jeg kan doble op på points en anden gang.
Hvor er det fedt, at der er nogle eksperter her på siden, som gerne vil dele ud af deres viden ...
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