Jaraz Geschrieben 29. April 2004 Teilen Geschrieben 29. April 2004 Hallo, ich habe mit meinem Treffen Skript noch ein kleines Problem was ich nicht auf anhieb hinbekommen habe und jetzt keinen Bock mehr habe. Wer Lust hat, kann sich ja mal dran wagen! Folgendes Array repräsentiert links (Tag im Monat 0-30) und rechts Teilnehmer. Dieses Array soll nun so sortiert werden, das erst die Tage mit den meisten Teilnehmern und zwar in chronologischer Reihenfolge und dann die Tage mit den zweit meisten Teilnehmern usw. ausgegeben werden. so siehts aus: Array ( [21] => 4 [7] => 4 [16] => 3 [8] => 3 [22] => 3 [28] => 3 [3] => 2 [12] => 2 [2] => 2 [14] => 2 [11] => 2 [10] => 2 [5] => 2 [6] => 2 [9] => 2 [17] => 2 [4] => 2 [26] => 2 [27] => 2 [29] => 2 [30] => 2 [25] => 2 [24] => 2 [18] => 2 [19] => 2 [20] => 2 [23] => 2 [15] => 1 [13] => 1 [1] => 0 [0] => 0 ) So solls aussehen: Array( [7] => 4 [21] => 4 [8] => 3 [16] => 3 [22] => 3 [28] => 3 [2] => 2 [3] => 2 . . . [13] => 1 [15] => 1 [0] => 0 [1] => 0 ) Kann sein das das relativ einfach ist, aber mir ist es im Moment zu spät und ich kann nicht mehr denken. :beagolisc Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kLeiner_HobBes Geschrieben 30. April 2004 Teilen Geschrieben 30. April 2004 Hallo! Verwende arsort(). Sollte eigentlich den gewünschten Effekt erzeugen, habs an nem kleinen Beispiel getestet. Gruß Benjamin Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 30. April 2004 Teilen Geschrieben 30. April 2004 Hallo! Verwende arsort(). Sollte eigentlich den gewünschten Effekt erzeugen, habs an nem kleinen Beispiel getestet. Gruß Benjamin ich habs grad nochma probiert,... damit gehts Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 30. April 2004 Autor Teilen Geschrieben 30. April 2004 ich habs grad nochma probiert,... damit gehts bei mir nicht, das hatte ich auch schon ausprobiert. vor asort: Array( [21] => 7 [7] => 7 [20] => 5 [6] => 5 [8] => 5 [22] => 4 [9] => 4 [16] => 4 [28] => 4 [4] => 3 [14] => 3 [5] => 3 [12] => 3 [10] => 3 [11] => 3 [18] => 3 [17] => 3 [27] => 3 [3] => 3 [2] => 3 [26] => 3 [25] => 3 [19] => 3 [23] => 3 [24] => 3 [15] => 2 [13] => 2 [30] => 2 [29] => 2 [1] => 0 [0] => 0 ) nach asort: Array ( [21] => 7 [7] => 7 [8] => 5 [20] => 5 [6] => 5 [16] => 4 [28] => 4 [9] => 4 [22] => 4 [3] => 3 [2] => 3 [26] => 3 [19] => 3 [27] => 3 [24] => 3 [23] => 3 [25] => 3 [18] => 3 [14] => 3 [17] => 3 [5] => 3 [4] => 3 [12] => 3 [11] => 3 [10] => 3 [29] => 2 [30] => 2 [13] => 2 [15] => 2 [0] => 0 [1] => 0 ) Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
*I C Q* Geschrieben 30. April 2004 Teilen Geschrieben 30. April 2004 @Jaraz: Ganz blöde Frage: Woher liest Du die Daten? ICQ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
*I C Q* Geschrieben 30. April 2004 Teilen Geschrieben 30. April 2004 Nachtrag: Die Frage war deshalb, weil man ja bei einer Abfrage aus einer Datenbank "einfach" mit ORDER BY arbeiten könnte, aber ich denke mal, darauf wärest Du auch gekommen. Eine Q'n'D-Lösung wäre das Arbeiten mit array_multisort: foreach ($arr as $key=>$value) { $arr2[] = array("tag"=>$key,"anzahl"=>$value); } foreach ($arr2 as $key=>$value) { $tag[$key]=$value["tag"]; $anzahl[$key]=$value["anzahl"]; } array_multisort($anzahl, SORT_DESC, $tag, SORT_ASC, $arr2); $arr = array(); foreach($arr2 as $key=>$value) { $arr[$value["tag"]]=$value["anzahl"]; } [/php] HTH, ICQ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 30. April 2004 Autor Teilen Geschrieben 30. April 2004 Nachtrag: Die Frage war deshalb, weil man ja bei einer Abfrage aus einer Datenbank "einfach" mit ORDER BY arbeiten könnte, aber ich denke mal, darauf wärest Du auch gekommen. Jepp! Das Skript sieht so aus: <html> <head> </head> <body> <?php /* benötigte Tabelle in Mysql Datenbank CREATE TABLE daten ( id int(11) NOT NULL auto_increment, name varchar(32) NOT NULL default '', wert bigint(20) NOT NULL default '0', monat varchar(32) NOT NULL default '', pass varchar(32) NOT NULL default '', PRIMARY KEY (id), UNIQUE KEY name_monat (name,monat) ) TYPE=MyISAM; */ /* Datenbanksettings laden verwendete Konstanten: _DB_EXT_HOST _DB_EXT_USER _DB_EXT_PASS _DB_EXT_NAME */ include("/home/xxx/php/settings.inc"); /* Konfiguration: Das array muss von Hand angepasst werden, wobei der erste Wochentag im Monat erst an zweiter Stelle stehen darf. Beispiel für Juli 2003, erster Tag ein Dienstag: $array = array("Mo","Di","Mi","Do","Fr","<font color=red>Sa","<font color=red>So"); */ $tageimmonat=31; $monatkurz="mai"; $monatlang="Mai"; $mailto="fi@xxx.com"; $mailfrom="fi@xxx.de"; $array = array("Fr","<font color=red>Sa","<font color=red>So","Mo","Di","Mi","Do"); // Ab hier keine Änderungen mehr notwendig //Datenbankconnection holen $link = mysql_connect(_DB_EXT_HOST, _DB_EXT_USER, _DB_EXT_PASS) or die("Could not connect"); mysql_select_db(_DB_EXT_NAME) or die("Could not select database"); echo "<h2>Wer hat wann fürs Düsseldorfer-FI-Frühjahrsgrillen 2004 Zeit?</h2>"; echo '<h4><font color="red">Das Passwort ist NICHT das fi.de Passwort sondern kann frei gewählt werden.</font></h4>'; //Wurde Formular abgeschickt? if(isset($senden)){ //Wert der in der Datenbank gespeichert wird erzeugen. //Eine Zahl für alle Tage eines Monats binärer Wert dezimal gespeichert. $j=0; if (isset($_REQUEST['cbutton'])) { reset($_REQUEST['cbutton']); while(list($k, $v) = each($_REQUEST['cbutton'])) { $j = $j + pow(2,($v-1)); } } //User überprüfen und bei Übereinstimmung löschen if($senden=="loeschen"){ $query = "DELETE from daten where id = ".$_REQUEST['who']." AND pass = '".$pass."'"; mysql_query($query); $result = mysql_affected_rows($link); if($result==0){ echo "<font color=red><b>Für das Löschen wird das Passwort benötigt.</b>"; } } //User überprüfen und bei Übereinstimmung ändern if($senden=="aendern"){ $query = "UPDATE daten SET wert = $j where id = ".$_REQUEST['who']." AND pass = MD5('".$pass."')"; mysql_query($query); $result = mysql_affected_rows($link); if($result==0){ echo "<font color=red><b>Falsches Passwort oder nichts geändert.</b>"; } //User überprüfen und bei Übereinstimmung speichern und Email generieren }elseif($senden=="speichern"){ if(strlen($pass)<3||strlen($userfeld)<3){ echo "<font color=red><b>Gebe einen Namen und ein Passwort mit mindestens 3 Zeichen ein.</b>"; }else{ $query = "INSERT INTO daten SET wert = $j, pass = MD5('".$pass."'), name = '".$userfeld."', monat = '".$monatkurz."'"; mysql_query($query); $result = mysql_affected_row; if($result==-1){ echo "<font color=red><b>Username existiert schon.</b>"; }else{ mail($mailto, "neuer User ".$userfeld, $userfeld, "From: ".$mailfrom."\r\n" ."X-Juniler: PHP/" . phpversion()); } } } } //Ausgabe des Formulars $query = "SELECT wert, name, id FROM daten where monat = '".$monatkurz."'"; $result = mysql_query($query) or die("Query failed"); $head = array(); print "<html><body>"; print "<table><tr><th><h3>".$monatlang."</h3></th>"; for($i=1; $i<($tageimmonat+1); $i++){ echo "<th align=\"center\">$i<br>".$array[($i%7)]."</th>"; } echo '<th align="left"><font color="red">Passwort bei jeder Aktion angeben:<br>NICHT das FI.de Passwort eintragen!</th></tr>'; //Formular: Zeilen der einzelnen User generieren while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { $mask = decbin($row["wert"]); echo '<form method="post" action="index.php" name="formular"><input type="hidden" name="who" value="'.$row["id"].'"><tr><td valign="top">'.$row["name"].'</td>'; $k = strlen($mask); for($i=1; $i<($tageimmonat+1); $i++){ $checked=""; if(substr ($mask, ($i-1), 1)==1){ $head[$k-$i][$row["id"]] = "checked"; } } for($i=1; $i<($tageimmonat+1); $i++){ echo '<td align="center"><input type="checkbox" name="cbutton[]" value="'.$i.'" '.$head[$i-1][$row["id"]].'></td>'; } echo '<td><input type="password" name="pass"><input type="submit" name="senden" value="aendern"><input type="submit" name="senden" value="loeschen"></td></tr></form>'; } //Formular: Eingabezeile generieren echo '<tr><td><u>Hier bitte eintragen:</u></td>'; $bestetage=array(); for($i=0; $i < $tageimmonat; $i++){ echo "<td align=\"center\">".count($head[$i])."</td>"; $bestetage[$i]=count($head[$i]); } echo '</tr>'; echo '<form method="post" action="index.php" name="formular"><input type="hidden" name="who" value="0"><tr><td valign="top"><input type="text" name="userfeld"></td>'; for($i=1; $i<($tageimmonat+1); $i++){ echo '<td align="center"><input type="checkbox" name="cbutton[]" value="'.$i.'"></td>'; } echo '<td><input type="password" name="pass"><input type="submit" name="senden" value="speichern"></td></tr></form>'; //Auswertung generieren asort ($bestetage); reset ($bestetage); $bestetage = array_reverse ($bestetage,TRUE); reset ($bestetage); $i=0; echo "<tr><td> </td></tr><tr><td colspan=\"".($tageimmonat+1)."\"><b><u>Momentan sind die besten Termine:</u></b></td></tr>"; while (list ($key, $val) = each ($bestetage)) { if($i<5||$val2==$val){ if($val2 != $val){ echo '<tr><td> </td></tr>'; } echo '<tr><td colspan="'.($tageimmonat+1).'">'.$array[(($key+1)%7)].' der '.($key+1).'.te '.$monatlang.', an dem '.$val.' Teilnehmer Zeit haben.</td></tr>'; $val2 = $val; $i++; } } echo '<tr><td> </td></tr><tr><td colspan="'.($tageimmonat+1).'"><font color=black>Anmerkungen an Jaraz im <a href="http://forum.fachinformatiker.de/member.php?s=&action=getinfo&userid=3702" target="_blank">Fachinformatiker Forum</a></td></tr>'; print "</table></body></html>\n"; mysql_free_result($result); mysql_close($link); ?> </body> </html> [/php] Alle Termine eines Users werden als ein Int in der Datenbank gespeichert. Deswegen ist das auch mit einer passenden Abfrage so schwer. Deine Vorschlag muss ich mir mal am Wochenende genauer anschauen, natürlich kann auch ruhig einer auf Basis der Quellcodes oben eine komplette Lösung posten. :floet: :WD Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 30. April 2004 Autor Teilen Geschrieben 30. April 2004 array_multisort war genau das was passt! Danke * I C Q * Irgendwie hat das früher nicht gepasst aber egal! // Beste Tage generieren foreach ($bestetage as $key=>$value){ $tag[$key]= $key; $anzahl[$key] = $value; } array_multisort($anzahl, SORT_DESC, $tag, SORT_ASC); Und dann $anzahl und $tag einfach in einer Schleife abarbeiten. Hat mir auch denn ganzen array reverse und usw quatsch erspart. Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.