Array sortierung
Daniel
- php
0 FrankieB0 Daniel0 FrankieB0 Daniel0 FrankieB0 Daniel
0 Vinzenz Mai
Hi,
ich glaub ich machs mir grad extra kompliziert. ich habe eine DB. in der gewisse dinge erfasst werden, z.B. welcher User welche programme nutzt. nun hole ich mir in der einen tabelle erstmal welche programme benutzt werden und schaue dann wieviele es benutzten (mit mysql_num_rows). funktioniert auch alles wunderbar. hab die ausgabe momentan direkt. nun bin ich dabei es umzustellen und das ganze in ein array zu speichern was so aufgebaut ist:
Array
(
[0] => Array
(
[3] => MS Word
// ^Anzahl-User => Programm
)
[1] => Array
(
[1] => MS Excel
)
[2] => Array
(
[2] => MS Access
)
[3] => Array
(
[1] => MySQL
)
)
nun würd ich das array gerne sortieren und dann eine ausgabe die in etwa so aussehen soll:
MS Word | 3
MS Access | 2
.
.
.
evt. auch ein bild mit dynamischem width="20*$anzahl". aber momenten
hänge ich an der sortierung. ich kriegs nicht hin, egal ob ich asort,
sort oder sonst was nehme, es klappt nicht wie ich will. weis mir da
vll jmd rat? ich bin kurz vorm verzweifeln.
Hallo Daniel,
nun würd ich das array gerne sortieren und dann eine ausgabe die in etwa so aussehen soll:
MS Word | 3
MS Access | 2
.
.
Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.
Grüsse
Frankie
Hi Frankie,
Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.
also das array wird so aufgebaut:
$sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";
$benutze_prog_erg = mysql_query($sql);
$benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten
for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++)
{
$sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)
$erg = mysql_query($sql);
if(mysql_num_rows($erg)>=1)
{
$daten = mysql_fetch_array($erg);
$sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?
$erg = mysql_query($sql);
$anzahl_user = mysql_num_rows($erg);
if ($anzahl_user>0)
{
$prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array
echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";
}
}
}
wie müsst ich den code verändern damit das gleich sortiert drinsteht?
ich hab grad nen hänger. und ich sagte ja das ich denke das ich mir
das leben unnötige schwer mache und der code unnötig kompliziert ist.
MfG
Hallo Daniel,
Frage: Warum baust Du das Array nicht gleich so zusammen wie Du es ausgeben möchtest? Würde alles erheblich einfacher machen.
also das array wird so aufgebaut:
$sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";
$benutze_prog_erg = mysql_query($sql);
$benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten
for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++)
{
$sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)
$erg = mysql_query($sql);
if(mysql_num_rows($erg)>=1)
{
$daten = mysql_fetch_array($erg);
$sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?
$erg = mysql_query($sql);
$anzahl_user = mysql_num_rows($erg);
if ($anzahl_user>0)
{
$prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array
echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";
}
}
}
>
> wie müsst ich den code verändern damit das gleich sortiert drinsteht?
~~~php
$sql = "SELECT id_programm, count(*) as anzahl_user FROM $tbl_lookup_amp GROUP BY id_programm";
$benutze_prog_erg = mysql_query($sql);
$out = "";
while ($row = mysql_fetch_array($benutze_prog_erg, MYSQL_ASSOC)) {
$sql = "SELECT name_program FROM $tbl_programme WHERE id_programm='".$row['id_programm']."' ORDER BY name_program";
$erg = mysql_query($sql);
if ($daten = mysql_fetch_array($erg)) {
$out[$daten['name_program']] = $row['anzahl_user'];
}
}
echo "<pre>"; print_r($out); echo "</pre>";
Die Ausgabe sollte nach name_program sortiert sein.
Das ist ungetestet, sollte aber prinzipiell funktionieren. Bezeichnungen und so mußt halt anpassen.
Probier's einfach mal aus und sag bescheid ob's funktioniert.
Grüsse
Frankie
Hi,
hab den code angepasst. allerdings schreibt er mir
Array
(
[MS Word] => 3
[MS Excel] => 1
[MS Access] => 2
[MySQL] => 1
)
also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,
allerdings wirds dann "falschrum" sortiert, also aufsteigend anstatt
absteigend. sprich ich bekomm
Array
(
[MySQL] => 1
[MS Excel] => 1
[MS Access] => 2
[MS Word] => 3
)
ich will aber, wie kann ich das ändern? ich steh heut voll auf meiner langen leitung.
Array
(
[MS Word] => 3
[MS Access] => 2
[MySQL] => 1
[MS Excel] => 1
)
MfG
Hallo Daniel,
hab den code angepasst. allerdings schreibt er mir
Freut mich, daß er funktioniert ,-)
also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,
allerdings wirds dann "falschrum" sortiert, also aufsteigend anstatt
absteigend. sprich ich bekommArray
(
[MySQL] => 1
[MS Excel] => 1
[MS Access] => 2
[MS Word] => 3
)ich will aber, wie kann ich das ändern? ich steh heut voll auf meiner langen leitung.
wie wär's mit rsort() ?
Grüsse
Frankie
Hi,
wie wär's mit rsort() ?
danke, aber das macht ja das Assoziative weck, dadurch bin ich aber auf
arsort() gestoßen, genau das was ich brauche. jetzt muss ich nurnoch für
die von mir gewünschte ausgabe sorgen.
Vielen dank für deine hilfe
MfG
Hallo!
wie wär's mit rsort() ?
danke, aber das macht ja das Assoziative weck, dadurch bin ich aber auf
arsort() gestoßen, genau das was ich brauche. jetzt muss ich nurnoch für
die von mir gewünschte ausgabe sorgen.
Wieso nicht alles direkt in einer SQL-Abfrage machen?
$sql = "SELECT
pname.name_programm as name,
count(*) as anzahl_user
FROM $tbl_lookup_amp as pid
LEFT JOIN $tbl_programme as pname
ON pid.id_programm = pname.id_programm
GROUP BY name
ORDER BY name";
$res = mysql_query($sql) or die('Fehler: ' . mysql_error());
$programme = array();
while ($row = mysql_fetch_assoc($res)) {
$programme[$row['name']] = $row['anzahl_user'];
}
echo "<pre>"; print_r($programme); echo "</pre>";
siehe http://dev.mysql.com/doc/mysql/de/join.html
Grüße
Andreas
Hi,
Wieso nicht alles direkt in einer SQL-Abfrage machen?
siehe http://dev.mysql.com/doc/mysql/de/join.html
weil das nicht geht. mein chef beschwert sich schon wenn ich in einem if
ein if hab. wenn ich dann komplexere sql abfragen mache, dann gibts wieder stress und jetzt kurz vor dem WE kann ich gut darauf verzichten.
MfG
Hallo!
Wieso nicht alles direkt in einer SQL-Abfrage machen?
siehe http://dev.mysql.com/doc/mysql/de/join.htmlweil das nicht geht.
Geht das technisch nicht, also werden nicht die richtigen Daten abgefragt?
mein chef beschwert sich schon wenn ich in einem if
ein if hab.
Naja, das zeugt manchmal von ineffizientem Code, der von Dir ist ein hervorragendes Beispiel (es sei denn es geht nicht anders, was ich so nicht beurteilen kann), sorry ;-)
Das zu verallgemeinern ist allerdings Schwachsinn. Viel schlimmer als ein if im if ist ein if in einer Schleife. Noch viel schlimmer ist eine SQL-Abfrage in der Schleife, und noch schlimmer sind mehrere Abfragen in einer Schleife, oder Abfragen die auch noch sorieren müssen...
wenn ich dann komplexere sql abfragen mache, dann gibts wieder stress und jetzt kurz vor dem WE kann ich gut darauf verzichten.
*g*
Das ist nicht komplex, und es ist nur eine einzige Abfrage die alles so abfragt wie Du es vermutlich brauchst, fertig sortiert...
Ich kommentiere mal Deinen Code:
$sql = "SELECT * FROM $tbl_lookup_amp GROUP BY id_programm ORDER BY id_programm desc";
$benutze_prog_erg = mysql_query($sql);
$benutze_prog_dat = mysql_fetch_array($benutze_prog_erg); //um die höchste ID der benutzten programme zu erhalten
Du willst die maximale ID für die Abfragen, um dann für jede ID von 1-MAX eine (sogar zwei) SQL-Abfragen an die DB zu schicken, die die benötigten Daten abfragt. Allerdings fragst Du nicht nur einen Datensatz ab, sondern es werden ALLE Daten in $tbl_lookup_amp (*) gruppiert nach id_programm von der Datenbank abgefragt. Zusätzlich werden alle Datensätze sortiert. Diese werden erstmal alle auf den CLient übertragen, Du benutzt dann aber nur einen einzigen der Datensätze. Hast Du 100 Produkt-IDs, werden auch 100 Datensätz übertragen. Die Daten bleiben bis zum Ende des Scriptes lokal im Speicher verfügbar, werden aber bis auf den einen Datensatz nicht abgefragt. Die JOIN-Variante ist alles in allem vermutlich kaum aufwändiger als diese eine Abfrage von Dir.
for($z=1; $z<= $benutze_prog_dat['id_programm']; $z++) {
Falls auch mal ein Produkt aus der DB gelöscht wird, oder mal ein Fehler beim Anlegen passiert ist, fehlen Dir IDs, was Dich zu den Workarounds unten zwingt.
Wenn Du 100 IDs hast, werden hier jetzt noch 200 Anfragen an die DB geschickt, wie gesagt, wenn Du JOIN verwendest ist und bleibt es eine einzige.
$sql = "SELECT * FROM $tbl_programme WHERE id_programm='$z'"; //daten der einzelnen programme lesen (name etc.)
$erg = mysql_query($sql);
if(mysql_num_rows($erg)>=1)
{
$daten = mysql_fetch_array($erg);
$sql = "SELECT * FROM $tbl_lookup_amp WHERE id_programm='$z'"; // Wie oft wirds benutzt?
$erg = mysql_query($sql);
$anzahl_user = mysql_num_rows($erg);
if ($anzahl_user>0)
{
$prog_array[][$anzahl_user] = $daten['name']; //eintrag in Array
echo "<tr><td>$daten[name]</td><td>$anzahl_user</td></tr>\n";
}
}
}
Bis auf den Programm-Namen fragst Du hier in der Schleife für jede einzelne ID Informationen ab, die Du bereits aus der allerersten Abfrage hast. Den Namen kannst Du Dir dann sehr einfach per JOIN besorgen. Dazu kommt dass Du mit Deiner Variante die Daten am Ende nocheinmal in PHP sortieren musst.
Wenn Dein Chef sich aufregt dass Du if in if verwendest, kann ich mir nicht vorstellen dass er mit solchen Schleifen zufrieden ist, außerdem verwendest Du immer * wordurch wahrscheinlich viel zu viele Daten übertragen und in den Arbeitsspeicher geladen werden. Du fragst z.B. in jedem Schleifendurchlauf ALLE Daten, die die Datenbank in $tbl_lookup_amp zu einem Produkt stehen hat ab, nur um die Datensätze zu zählen, und das wohl gemerkt in einer Schleife!
Aber gut, musst Du natürlich selbst wissen wie Du das machst ;-)
Grüße
Andreas
Hi,
Aber gut, musst Du natürlich selbst wissen wie Du das machst ;-)
ich mach es so das es meinem chef recht ist. wenn ich privat
programmiere schau ich auch das ich transfer etc. niedrig halte. da das
ganze aber eh nicht übers internet läuft, nichtmal über intranet sondern
nur lokal ist der zusätzliche zeitaufwand ja recht gering und der viele
datentransfer unwichtig. Und von wegen alle daten in den ganzen tabellen
sind nur 2-3 spalten. wobei in nur einer irgendwas steht in den anderen
bzw der anderen nur die ID.
MfG
Hallo Daniel
hab den code angepasst. allerdings schreibt er mir
Array
(
[MS Word] => 3
[MS Excel] => 1
[MS Access] => 2
[MySQL] => 1
)also unsortiert. deshalb hab ich ein asort($out); noch eingefügt,
Die ORDER BY-Klausel ist ganz hilfreich. Füge diese Franks SQL-Statement an, und Du erhältst, was Du haben willst. Natürlich mit DESC.
Freundliche Grüße
Vinzenz