Zum Inhalt springen

Programmieraufgabe PHP


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...