PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sortierung eines Umfrageergebnisses


php_anfaenger
02.11.2005, 17:16:07
Hallo an Alle!

Habe folgendes Problem: Bei der Anzeige des Ergebnisses soll die Antwort, die die meisten Stimmen bekommen hat natürlich ganz oben stehen - also eine absteigende Reihenfolge. Gleichzeitig soll aber die Platzierung in aufsteigender Reihenfolge angezeigt werden.

Vielleicht kann mir jemand einen tip geben oder mir erklären warum die Platzierung absteigend ist und nicht aufsteigend?

Hier mal ein Bild:
http://www.bremissimo.de/img/tabelle.gif

Hier mal das Script (die Daten werden in .txt gespeichert):

<?PHP
//Platzierung
$aufz="platz.txt"; // datei mit fortlaufender Nummerierung 1-50

//Display results
$counts=file($temp); //array aller gezählten Stimmen aus der temp.txt
arsort ($counts); //sortierung des arrays, absteigend
while (list ($line_num, $line) = each ($counts)) // schleife
{
@$percent = "$line"/"$all"*"100";
$percent = round($percent , 1);
$countanswer = file($dbanswer);
$line = trim($line);
$rank = file($aufz);
$result= "
<tr>
<td><font>$rank[$line]</font></td> // PROBLEM STELLE
<td><font>$countanswer[$line_num] <font>($line)</font></td>
<td><font><img src=\"poll.gif\" width=\"$percent\"> $percent% </font></td>

</tr>";
echo $result;
}
?>

Vielen Dank schonmal!

xabbuh
02.11.2005, 17:29:15
Entweder du erhöhst eine Variable bei jedem Durchlauf der Schleife um 1 und gibst diese aus oder du ermittelst die Anzahl aller Datensätze vor der Schleife. Dann ist die Platzierung bei jedem Durchlauf $numall - $rank[$line] + 1.

php_anfaenger
02.11.2005, 18:01:14
Hallo xabbuh,

vielen Dank für die Antwort. Die Lösung mit der Erhöhung um 1 pro Durchlauf hört sich gut an. Hab das mal versucht umzusetzen, leider wird dann an jeder stelle Platz 1 angezeigt. Kannst du mir da nochmal einen Tip geben?

Danke!


<?PHP
//Platzierung
$rank = "0";

//Display results
$counts=file($temp); //array aller gezählten Stimmen aus der temp.txt
arsort ($counts); //sortierung des arrays, absteigend
while (list ($line_num, $line) = each ($counts)) // schleife
{
@$percent = "$line"/"$all"*"100";
$percent = round($percent , 1);
$countanswer = file($dbanswer);
$line = trim($line);
$numall = "$rank"+"1";
$result= "
<tr>
<td><font>$numall</font></td> // PROBLEM STELLE
<td><font>$countanswer[$line_num] <font>($line)</font></td>
<td><font><img src=\"poll.gif\" width=\"$percent\"> $percent% </font></td>

</tr>";
echo $result;
}
?>

php_anfaenger
02.11.2005, 18:53:50
Oder vielleicht weiss jemand wie ich die Werte aus der Datei platz.txt (in der die Zahlen von 1 bis 50 stehen) nacheinander auslesen kann. Also das beim erten schleifendurchlauf die 1 erscheint beim zweiten die 2 etc.

wenn ich das so versuche:

<td><font>$rank</font></td> // PROBLEM STELLE

dann wird immer das wort ARRAY ausgegeben.

Kann mir bitte jemand helfen?

Stevie B.
02.11.2005, 19:45:10
Klar, $rank ist ja auch immer 0. Also musst Du $rank = $rank + 1; nehmen und dann $rank ausgeben.

xabbuh
02.11.2005, 19:51:07
Also musst Du $rank = $rank + 1; nehmen und dann $rank ausgeben.
Oder gleich print ++$rank schreiben.

wenn ich das so versuche:

<td><font>$rank</font></td> // PROBLEM STELLE

dann wird immer das wort ARRAY ausgegeben.
Wie immer, wenn du auf Arrays zugreifen willst, musst du immer in eckigen Klammern das entsprechende Element angeben. Dafür brauchst du aber eine Zählervariable, die sich bei jedem Durchlauf inkrementiert und da ist das Array dann überflüssig, da du nur noch den Zähler ausgeben muss.

php_anfaenger
04.11.2005, 21:13:49
Hallo tausend dank für die Antworten!

Hab noch eine kleine zusatzfrage:

Ich lasse das array (besteht nur aus zahlen) absteigend sortieren, mit dem befehl arsort. Leider werden dann die zahlen nicht natürlich sortiert, sondern 3, 22, 2, 11, 1 usw.
Zum natürlichen sortieren gibt es den befehl natsort, doch leider funktioniert der nur aufsteigend. Gibt es auch einen befehl der natürlich und absteigend sortiert?

<?PHP
arsort ($counts); //sortierung des arrays, absteigend
?>

Danke schonmal!

xabbuh
04.11.2005, 22:32:27
Einfach mit natsort() aufsteigend sortieren und anschließend die Reihenfolge mit array_reverse() umdrehen. Oder du sortierst mit Hilfe von usort().

php_anfaenger
05.11.2005, 19:00:59
Danke für die Antwort.
Mit usort funktioniert es leider nicht, weil dann die einträge komischerweise nach dem nach den index zahlen sortiert werden.
Mit array_reverse funzt es leider auch nicht. hab es wie unten zu sehen in den code gebastelt, leider wird die reihenfolge nicht umgedreht, sondern die Werte werden aufsteigend sortiert als wenn der befehl gar nicht da stehen würde.

Oder ist das nicht richtig eingefügt?

<?PHP
$counts=file($temp);
natsort ($counts);
array_reverse ($counts);
while (list ($line_num, $line) = each ($counts))
{
@$percent = "$line"/"$all"*"100";
$percent = round($percent , 1);
$balken = "$percent"*"3";
$countanswer = file($dbanswer);
$rank = $rank + 1;
$line = trim($line);
?>

xabbuh
06.11.2005, 19:36:49
Mit usort funktioniert es leider nicht, weil dann die einträge komischerweise nach dem nach den index zahlen sortiert werden.
Wie hast du usort() denn verwendet?

array_reverse ($counts);
Bei array_reverse() erfolgt die Übergabe des Arrays im Gegensatz zu den Sortierfunktionen nicht als Referenz. Deswegen musst du den Rückgabewert von array_reverse() aufnehmen:

<?php
$counts = array_reverse($count);
?>

|Coding
06.11.2005, 20:04:02
@$percent = "$line"/"$all"*"100";
Äh, hat das einen bestimmten Sinn?

php_anfaenger
07.11.2005, 14:53:29
Hallo xabbuh,

usort, habe ich so eingefügt:

<?PHP
$counts=file($temp);
usort ($counts);
while (list ($line_num, $line) = each ($counts))
{
@$percent = "$line"/"$all"*"100";
$percent = round($percent , 1);
$balken = "$percent"*"3";
$countanswer = file($dbanswer);
$rank = $rank + 1;
$line = trim($line);
?>


Habe das mal mit natsort und array_reverse probiert:

<?PHP
$counts=file($temp);
natsort ($counts);
$counts=array_reverse ($counts);
while (list ($line_num, $line) = each ($counts))
{
@$percent = "$line"/"$all"*"100";
$percent = round($percent , 1);
$balken = "$percent"*"3";
$countanswer = file($dbanswer);
$line = trim($line);
$result= "
<tr>
<td><font>$countanswer[$line_num]<font>($line)</font></td>
<td><img src=\"poll.gif\" width=\"$balken\"> $percent% </font></td>
</tr>";
echo $result;
}
?>

Leider werden die Antworten ($countanswer) nicht mit sortiert, sondern werden in der reihenfolge, wie sie in dem array stehen ausgegeben. Somit werden nur die anzahl der abgegebenen stimmen ($line) sortiert. Die assoziation scheint irgendwie verloren gegangen zu sein.
Kann man die wieder herstellen oder etwas mit usort machen?

php_anfaenger
08.11.2005, 19:22:32
Hallo Coding,

tja äh das passiert, wenn man nie die gelegenheit gehabt hat vernünftig programmieren zu lernen. Hoffe aber hier im forum noch einiges dazulernen zu können.

Grüsse

php_anfaenger
08.11.2005, 19:57:47
Hallo an alle!

Hab die Lösung gefunden:

$array = array_reverse($array, true);

das "true" hatte bei meiner version gefehlt.

Nochmal danke an alle!

meikel (†)
08.11.2005, 20:07:30
@$percent = "$line"/"$all"*"100";
Äh, hat das einen bestimmten Sinn?
Na klar! Da gabs ganz billig einen Sack voll überflüssiger Gänsefüße.

|Coding
08.11.2005, 22:22:32
Naja Meikel, ich meinte aber eher das @, obwohl die doublequotes auch überflüssig sind :-)

meikel (†)
09.11.2005, 01:01:21
Naja Meikel, ich meinte aber eher das @, obwohl die doublequotes auch überflüssig sind :-)
Beides ist Unfug. Bisweilen findest Du den Gänsefußunsinn sogar noch höchstoffiziell im Handbuch.