Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Programmieraufgabe PHP

Empfohlene Antworten

Veröffentlicht

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

Hallo!

Verwende arsort().

Sollte eigentlich den gewünschten Effekt erzeugen, habs an nem kleinen Beispiel getestet.

Gruß

Benjamin

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

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

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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.