PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP array_multisort?


mapel110
2008-04-29, 12:34:17
Ich packe ein Array mit mssql_fetch_array in $row.
Das will ich nun sortieren nach mehreren Parametern.

$row = mssql_fetch_array($result);
array_multisort($row['Nummer'], SORT_ASC, SORT_NUMERIC,$row['Nummer2'],SORT_ASC,SORT_NUMERIC,$row['Uhrzeit'], SORT_ASC);

Bei der Ausgabe von $row mit einer Foreach-Schleife bekomme ich nur Müll.

foreach ($row as $wert){
echo "Nummer:".$wert['Nummer']."---".$wert['Nummer2']."----".$wert['Uhrzeit']."<br>";
}

Wieso? ;(

Kinman
2008-04-29, 13:13:11
Zu Dein akuten Problem kann ich leider nicht helfen, aber warum sortierst Du nicht zuerst mittels SQL?

mfg Kinman

mapel110
2008-04-29, 13:38:28
Zu Dein akuten Problem kann ich leider nicht helfen, aber warum sortierst Du nicht zuerst mittels SQL?

mfg Kinman
hm, auch eine Idee. Ja. Wobei ich schon gerne wüsste, warum er da mit dem $row so einen Murks macht. Prinzipiell sollte das ja so gehen.

Kinman
2008-04-29, 13:47:09
http://www.php.net/manual/de/function.array-multisort.php

Bei auslesen von einer DB:

Wir haben ein Array von Zeilen, aber array_multisort() benötigt ein Array von Spalten, daher benutzen wir den Code unten, um die Spalten zu bekommen und dann die Sortierung durchzuführen.

http://photo-sorko.at/dunno.gif

mfg Kinman

mapel110
2008-04-29, 14:02:44
http://www.php.net/manual/de/function.array-multisort.php

Bei auslesen von einer DB:



http://photo-sorko.at/dunno.gif

mfg Kinman
hmhm, das könnte es sein. Ich werds bei Gelegenheit nochmal durchackern. Aber SQL langt erstmal.

/offtopic
Wenn ich noch mit dem SQL GROUP BY umgehen könnte, wäre da vielleicht noch mehr drin und ich könnte mir in PHP viel ersparen. Na egal, etwas Arbeit muss sein.

Ich hab jedenfalls eine Nummer1, eine Nummer2 und zu deren Kombination gehört jeweils ein Wert. Der Wert an sich ist egal. Es muss nur die Anzahl entsprechend gezählt werden und das ganze noch datumsabhängig.
O_o

/edit
DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00') AS Uhrzeit

Sowas hab ich zur Verfügung. Das Datum in der Form "01.01.1970 01:00".
Jetzt will ich das damit GROUP BYen nach Tagen. Aber das will ums Verrecken nicht klappen...

Kinman
2008-04-29, 16:15:22
Hmm.. leider versteh ich Deine Aufgabe nicht wirklich, vielleicht könntest Du es etwas Besser beschreiben.

So hab ich verstanden
In einer Tablle hast du 4 relevante Felder
Nummer1, Nummer2. Wert und das Datum

Und Du solltest jetzt die Anzahl der Datensätze, bei denen Nummer1 und Nummer2 passen herausfinden und das ganze noch nach Datum (bzw. Tagen) getrennt.

Stimmt das?

mfg Kinman

mapel110
2008-04-29, 16:21:35
Ja, das Datum bekomme ich mittlerweile mit der Funktion "datepart" nach Tagen gegliedert. Aber ich raffe den GROUP BY immernoch nicht so ganz.

1. Muss alles, was ich selecte, auch im Group By stehen?
2. Wie kann ich dann gruppenweise etwas zählen lassen?
3. Wie wird das ganze nach dem Gruppieren gespeichert? (Speziell jetzt das Gezählte, steht das dann in jedem betroffenen Datensatz zusätzlich?!)

/edit
ach, dann gibts wohl nur noch die "Gruppen"? Und das Ergebnis ist also einmal vorhanden von dem Zählen? O_o

Kinman
2008-04-29, 17:08:04
Bei den Gruppen kannst Du mit HAVING selektieren und die Aggregatsfunktionen (COUNT, MIN, MAX, uvm.) verwenden

mfg Kinman

Coda
2008-04-29, 18:00:51
hm, auch eine Idee. Ja. Wobei ich schon gerne wüsste, warum er da mit dem $row so einen Murks macht. Prinzipiell sollte das ja so gehen.
Was willst du auch sortieren wenn du nur eihe Reihe hast? Das ist nicht der komplette Output des SQL-SELECTs.

mapel110
2008-04-29, 18:26:16
Mal konkret:

Tabelle:
Nummer1 Nummer2 Wert Datum

SELECT
Nummer1
Nummer2
Wert
Datum
DATEPART(dd, Datum)
FROM
Tabelle
WHERE
blablabla
GROUP BY
DATEPART(dd, Datum)
ORDER BY
Nummer1, Nummer2, Datum

Was fehlt da noch, wenn ich jetzt Wert pro Kombination Nummer1+Nummer2 pro Tag gezählt haben möchte?
Was willst du auch sortieren wenn du nur eihe Reihe hast? Das ist nicht der komplette Output des SQL-SELECTs.
hm okay, also ists der Fehler mit den Reihen und Spalten.

/edit
Die Lösung nach weiteren 2 Stunden und ein wenig Fachsimpeln mit den 2 Azubis:
SELECT
Nummer1
Nummer2,
datepart(dd,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')) AS Tage,
COUNT(*) AS Anzahl
FROM
tab1
INNER JOIN
tab2
ON (Nummer1 = Nummer3)
WHERE
blablabla
GROUP BY
Nummer2, Nummer1, datepart(dd,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00'))
ORDER BY
Nummer2 ASC, Nummer1 ASC, Tage ASC");

:ugly:
Die Performance ist allerdings ziemlich mies. Es gibt etwa bis zu 150 Nummern-Kombinationen im Extremfall und das dann über einen Zeitraum, der auch mehrere Monate betragen kann ....

Kinman
2008-04-30, 10:41:41
Was verstehst Du unter mies?
Ich denke in Vergleich zur PHP Lösung wird das um einiges schneller sein...

mfg Kinman

mapel110
2008-04-30, 10:52:25
Er hat für 25 Kombinationen von Nummer1, Nummer2 und einen Zeitraum von 24 Tagen mit insgesamt 4000 Datensätzen länger als 1 Minute gebraucht.
Ist das nicht schlecht? O_o
Ich hab Bedenken, die ini_set('max_execution_time','120'); weiter hochzusetzen. 120 Sekunden find ich schon zu viel.

Kinman
2008-04-30, 11:16:39
Ich habe ein Skript, welches mehrere Minuten benötigt. Von daher ist das mit dem ini_set sicher kein Thema.

Der einzige Unterschied, da ich eine Schleife habe, in der die Berechnungen ablaufen, prüfe ich immer wieder wie lang das Skript schon "wieder" läuft und wenns zu 240 Sekunden geht, erhöhe ich mittels set_time_limit() die Zeit wieder um 300 Sekunden.

mfg Kinman