Avatar billede nwn Nybegynder
22. december 2008 - 23:08 Der er 22 kommentarer og
1 løsning

Simpelt array

Hej.

Jeg har _aldrig_ før arbejdet med arrays i PHP. Jeg står så nu i en situation, hvor jeg skal bruge et array.

Det lyder såldes:

I mit brugersystem har jeg et felt i SQL tabellen kaldt "point". Det angiver mærkeligt nok, hvor mange point brugerne har.

Jeg skal så have udskrevet en liste, med alle brugerne og deres _placering_ (Placering ud fra point). Placeringen skal beregnes, dvs. der er ikke noget felt i SQL tabellen kaldt placering eller lign.

For at beregne den enkelte brugers placering, kører jeg en løkke der kører gennem alle brugere. Hvis den enkelte brugers antal point, er mindre end brugeren, som løkken er nået til, så plusses en variabel der starter på 0, med 1.

Det fungerer fint, og gør også, at brugere med samme antal point, får samme placering, så det er fair.

Problemet opstår så i det, at brugerne med samme antal point, har samme placering. For når en bruger med f.eks 2 point mindre end alle de andre brugere med samme antal point, skal have beregnet sin placering, så vil den ligge MEGET lavere.

Jeg skal derfor inde i løkken, have lagt brugerens point, altså brugeren som løkken er nået til, ind i et array, hvorved jeg så med en if statement inde i løkken, kan sørge for, at denne variablen der starter på 0, kun plusses med 1, så fremt brugeren den er nået til's antal point, ikke findes i array'et.

En smule besværligt at forklare, men jeg håber i forstår.
Avatar billede plazm Nybegynder
22. december 2008 - 23:42 #1
så du har følgende:
Spiller1 - 40point,
Spiller2 - 13point,
Spiller3 - 40point,
Spiller4 - 16point

og vil have

spiller 1 - 1plads
spiller 3 - 1plads
spiller 4 - 3plads
spiller 2 - 4plads
?
Avatar billede nwn Nybegynder
22. december 2008 - 23:48 #2
Præcis. Mit nuværende problem er jo så, at det ser sådan ud, f.eks:

Spiller 1 - 100 point
Spiller 2 - 100 point
Spiller 3 - 200 point
Spiller 4 - 99 point

Så får den pladserne:

Spiller 1 - 2. Plads
Spiller 2 - 2. Plads
Spiller 3 - 1. Plads
Spiller 4 - 4. Plads

Som der kan ses, skal Spiller 4. have 3. Plads og ikke 4. Plads. Grunden til dette, er at jo, at der er 3 andre spillere, der har flere point end ham. Men jeg skal så have lagt alle spillernes point ind i et array når løkken køres, så der ikke opstår dette problem. Jeg kan så selv fikse resten ved hjælp af if statements.
Avatar billede nwn Nybegynder
22. december 2008 - 23:50 #3
Dvs. det eneste jeg skal have hjælp til, det er følgende:

1. Lave et array.
2. Indsætte til array'et.
3. Vide hvordan jeg præcist kan spørge om noget er lig med, blot EN af de ting array'et indeholder.
Avatar billede fant0mas Nybegynder
22. december 2008 - 23:55 #4
Det er meget bedre at lave det i ren sql, hvordan ser din tabel ud? Der er vel flere rækker for hver enkelt bruger?
Avatar billede nwn Nybegynder
22. december 2008 - 23:57 #5
Jeg kan ikke lige se fordelene ved at skulle til at bruge SQL til.

Ikke flere rækker, men flere felter. Brugernavn, password osv.
Avatar billede fant0mas Nybegynder
23. december 2008 - 00:02 #6
Brugeren har vel en relation til en point tabel med noget ala:
bruger id 50
+15 pts
+12 pts
-9 pts
+666 pts
-1 pts
?
Avatar billede nwn Nybegynder
23. december 2008 - 00:09 #7
Nej nej. Hvis brugerens point ændres, foretages det blot med enkelt linie SQL query med UPDATE.
Avatar billede nwn Nybegynder
23. december 2008 - 01:41 #8
Avatar billede jakobdo Ekspert
23. december 2008 - 06:57 #9
Hvorfor løse det med array ?
Det kan du jo styre i en sql ?

SELECT brugernavn,point FROM brugere ORDER BY point
Avatar billede nwn Nybegynder
23. december 2008 - 13:19 #10
Mærkeligt jeg ikke har tænkt på det noget før. Det vil jo egentlig også sørge for, at ingen brugere kan have samme placering.

Men du tænker på noget i den her stil?:

$brugernavn = Her har vi den enkelte brugers brugernavn
$placering = 1;

$hent_brugere = mysql_query("SELECT * FROM `brugere` ORDER BY `point`");

while ($vis_brugere = mysql_fetch_array($hent_brugere))
{
if ($vis_brugere["brugernavn"] == $brugernavn)
{
//Kode til at stoppe while (Må du iøvrigt gerne hjælpe mig med)
}
else
{
$placering++;
}
}
Avatar billede nwn Nybegynder
23. december 2008 - 13:21 #11
Og så skal der vel også smides DESC ind efter `point`
Avatar billede jakobdo Ekspert
23. december 2008 - 13:28 #12
Jep. :o)
Avatar billede jakobdo Ekspert
23. december 2008 - 13:29 #13
Og så kan du jo lave noget ala:

ORDER BY point DESC, navn, noget osv...
Så hvis 2 har samme antal point, så er det den med navn eller noget andet, som sorteres efter.
Avatar billede nwn Nybegynder
23. december 2008 - 13:42 #14
Jeps, har fået det til at virke. Skal dog på en måde kunne stoppe løkken, når den de brugerne matcher hinanden ;) Lige pt. bruger jeg 2 variabler, blot lige for at se, om det ville virke.

Men jeg har prøvet med exit(); endwhile; etc, ligger du inde med noget?
Avatar billede fant0mas Nybegynder
23. december 2008 - 13:59 #15
break;
Eller LIMIT 5 i din query
$hent_brugere = mysql_query("SELECT * FROM `brugere` ORDER BY `point` LIMIT 5");

Men du har vil ikke flere brugere der er ens?
Det er vel points du skal sammenligne?
Avatar billede nwn Nybegynder
23. december 2008 - 14:26 #16
Jeg har prøvet break; og den kunne jeg ikke lige få til funke. Jeg prøver igen så.

Jo der er flere brugere med samme antal point.

Skal ikke bruge noget med limit, da jeg bare skal have løkken til at stoppe, så snart løkken når frem til brugeren man kigger på.
Avatar billede nwn Nybegynder
23. december 2008 - 14:32 #17
Jo, det virkede med break;

Jeg takke mange gange for hjælpen, fra jer begge. Er i interesserede i at dele 30 point?
Avatar billede jakobdo Ekspert
23. december 2008 - 14:33 #18
Kunne du ikke bruge noget ala:

find brugerens antal point med:
//Finder brugeren
SELECT point FROM brugere WHERE navn = 'noget' LIMIT 1
//Finder placering
SELECT COUNT(*) FROM brugere WHERE point > $point_fra_før
//Placering = placering + 1
Avatar billede jakobdo Ekspert
23. december 2008 - 14:34 #19
Faktisk noget ala denne: http://www.eksperten.dk/spm/731927
Avatar billede nwn Nybegynder
23. december 2008 - 15:32 #20
Jamen så har jeg fundet frem til:

$hent_placering = mysql_query("SELECT COUNT(*) AS placering FROM `brugere` WHERE `point` > '$vis_bruger[point]'");
$vis_placering = mysql_fetch_assoc($hent_placering);

$placering = $vis_placering["placering"] + 1;

Men så kan brugerne have samme placering. Så hellere den anden metode med SQL, hvor jeg selv kan vælge at sorterer ;-)
Avatar billede pepsiman Juniormester
24. december 2008 - 12:09 #21
hej.

jeg lytter med for at jeg vil bruger også til Whist - kortspil.
når jeg har tid til at lave det.

god jul
Avatar billede jakobdo Ekspert
24. december 2008 - 12:33 #22
Skal brugere med samme antal point have samme placering eller ej ?
Avatar billede fant0mas Nybegynder
24. december 2008 - 15:50 #23
$point_fra_foer = 10;
$query = mysql_query("SELECT point FROM brugere WHERE point > $point_fra_foer ORDER BY points DESC") or die(mysql_error());
$i=1;
echo '<table>';
while($result = mysql_fetch_assoc($query)){
    echo '<tr><td>';
    echo ($result['points'] != $last_number)? $i++: '';
    echo '</td><td>'.$result['points'].'</td></tr>';
    $last_number = $result['points'];
}
echo '</table>';
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

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