Probleme bei Sortieren der Daten im Array

Divo1984

Erfahrenes Mitglied
Hallo liebe Community,

ich will nicht lange schwafeln;)

Meine Datenbank schaut in etwa so aus:

id (Primary Key)
name
frage
antwort_1
stimmen_1 (INT)
antwort_2
stimmen_2(INT)
antwort_3
stimmen_3(INT)
......

Es ist ein Umfragescript, welches auch funktioniert;) Die Stimmen werdem mit Update übergeben - alles chic.

Mein Prob ist folgendes:

Ich habe 50 Antworten und somit auch 50 Felder wo die Werte zum abstimmen reingehen welche ich zur Auswertung über Arrays auslese

PHP:
$sql="SELECT * FROM `umfrage2` WHERE id='".get("id")."'";
		$abfrage = mysql_query($sql);
     	while ($row = mysql_fetch_array($abfrage))
     	{
     		
     		foreach($row as $k => $v) $$k=$v;
			echo"$name<br><br><br><table width=\"100%\">
     		<tr><th width=\"30%\">Name</th><th width=\"30%\">Stimmen</th><th width=\"40%\">Platz</th></tr>";
			$gesstimmen=0;
			

     		foreach($abc as $v)
			{
				$i=1;
				$stimmenx="stimmen_".$v;
				$gesstimmen+=$$stimmenx;  
			}
     			
  				foreach($abc as $v)
  				{
					
  					$antwortx="antwort_".$v;  					
  					$antwortx=$$antwortx;
  					
  					$stimmenx="stimmen_".$v;
  					$stimmenx=$$stimmenx;
  					$stimmenb=array($stimmenx);
  					//$sort[$stimmenx]=$$stimmenx;
  					natsort($stimmenb);
  					foreach($stimmenb as $sor)
  					//$rate=@round($stimmenx*100/$gesstimmen,2);
  					{
						echo "<tr><th>".$antwortx."</th><td>$sor</td><th>".$i++."</th></tr>\n";
  					}
  				}
  			}
  				echo"</table>";

Nur stelle ich mich leider bisschen plüschig beim sortieren an:(

Meine Ausgabe lautet ungefähr so:

0
1
3
1
1
0
0
0

warum klappt das Soriteren bei mir nicht? Bin für jeden Tip dankbar! Sortiert werden soll nach der Menge, der abgegebenen Stimmen. Also nach dem höchsten Wert in
PHP:
stimmen_".$v
 
item: uihhhh. Ganz schlechte Datenstruktur. Normalisieren der Daten tut Not.
item: Du beginnst pro Zeile eine Tabelle, schliesst die Tabellen aber nicht pro Zeile sondern erst am Schluss. Würdest du das PHP sauber formatieren, dann würde das auffallen
item: was ist $abc?

Hab da mal ein Testbeispiel gemacht. Musst das ganze halt noch auf den DB-Zugriff zurückschreiben
PHP:
<?php 
//Testbeispiel mit 3 möglichen Antworten
$rows[]=array('id' => 1, 'name' => 'test 1', 'antwort_1' => 'ja', 'stimmen_1' => 15, 'antwort_2' => 'nein', 'stimmen_2' => 9, 'antwort_3' => NULL, 'stimmen_3' => NULL);
$rows[]=array('id' => 2, 'name' => 'test 2', 'antwort_1' => 'rot', 'stimmen_1' => 3, 'antwort_2' => 'grün', 'stimmen_2' => 5, 'antwort_3' => 'blau', 'stimmen_3' => 4);

//Die Anzahl Antworten die in der DB möglich sind definieren. Bei dir währe das 50
define('C_COUNT_DB_ANSWERS', 3);


//while zum testen der Testbeispiele durch foreach ersetzt
//while ($row = mysql_fetch_array($abfrage)){
foreach($rows as $row){
    //Tabellen öffnen und die Header-Zeile schreiben
    echo <<<TBL
<h1>{$row['name']}<h1/>
<table width=\"100%\">\n
    <tr>
        <th width=\"30%\">Name</th>
        <th width=\"30%\">Stimmen</th>
        <th width=\"40%\">Platz</th>
    </tr>\n
TBL;
    
    //Antworten und Stimmen extrahieren
    $res=array();
    for($i = 1; $i <= C_COUNT_DB_ANSWERS; $i++){    
        if(!is_null($row["antwort_{$i}"])){
            $res[$row["antwort_{$i}"]] = $row["stimmen_{$i}"]; 
        }
    }

    //Sortieren DESC (Index beibehalten)
    arsort($res);
    
    //Ausgeben
    $pos = 0;
    foreach($res as $antwort => $stimmen){
        echo "<tr><th>{$antwort}</th><td>{$stimmen}</td><th>".++$pos."</th></tr>\n";
    }
    //Tabelle innerhalb der äussersten Schleife wieder schliessen
     echo"</table>";  
}

?>
 
Mist, zu früh gefreut:(

PHP:
<?php
	 
		
		$sql="SELECT * FROM `umfrage2` WHERE id='".get("id")."'";
		$abfrage = mysql_query($sql);    	
     	
     	define('C_COUNT_DB_ANSWERS', 50);

//while zum testen der Testbeispiele durch foreach ersetzt
while ($row = mysql_fetch_assoc($abfrage)){
//foreach($rows as $row){
    //Tabellen öffnen und die Header-Zeile schreiben
    echo"
<h1>{$row['name']}<h1/>
<table width=\"100%\">\n
    <tr>
        <th width=\"30%\">Name</th>
        <th width=\"30%\">Stimmen</th>
        <th width=\"40%\">Platz</th>
    </tr>\n
";
    
    //Antworten und Stimmen extrahieren
    $res=array();
    for($i = 1; $i <= C_COUNT_DB_ANSWERS; $i++){    
        if(!is_null($row["antwort_{$i}"])){
            $res[$row["antwort_{$i}"]] = $row["stimmen_{$i}"]; 
        }
    }

    //Sortieren DESC (Index beibehalten)
    arsort($res);
    
    //Ausgeben
    $pos = 0;
    foreach($res as $antwort => $stimmen){
        echo "<tr><th>{$antwort}</th><td>{$stimmen}</td><th>".++$pos."</th></tr>\n";
    }
    //Tabelle innerhalb der äussersten Schleife wieder schliessen
     echo"</table>";  
}
    	
    		

    	?>

Hört nach 6 Durchläufen auf auszugeben:( und gibt leider einen wert nicht so aus wie es sollte:

Name Stimmen Platz
ester 3 1
teste 1 2
tesd 1 3
"leer"* 0 4
dfd 0 5
test 0 6

*das Feld ist wirklich leer!
 
mit der folgenden Zeile wird geprüft, ob überhaubt eine Frage gestellt wurde. Das kannst du natürlich auch auf die Stimmen ansetzen anstelle der antwort
PHP:
if(!is_null($row["antwort_{$i}"])){
//ändern zu 
if(!is_null($row["stimmen_{$i}"])){
 
Habe die Zeile wie folgt abgeändert, jetzt gehts! Vielen lieben Dank;)

PHP:
if(($row["antwort_{$i}"])!='')
 

Neue Beiträge

Zurück