mehrdemensionales Array sortieren
Dusi
- php
0 suit0 Dusi0 Peter Pan
2 Sven Rautenberg0 Tom
Hallo zusammen,
habe ein kleines Problem:
Ich bekomme aus verschiedenen Tabellen Beträge, der Aufbau der Tabellen ist aber immer anders. Teilweise muss ich die Beträge erst errechnen, teilweise stehen sie direkt so in der Datenbank.
Nun möchte ich eine Art Kontoübersicht bauen, wo also Einnahmen und Ausgaben nach Datum sortiert sind.
Ich hatte mir nun überlegt, das ich die Daten dann in ein mehrdimensoniales Array schreibe nach dem Schema:
Datum - Betrag - Bezeichnung(woher der betrag kommt)
Ich komme aber leider nicht so ganz mit den Arrayfunktionen klar, bzw. weiss nicht welche ich nehmen soll oder ob mein vorhaben so überhaupt möglich ist.
z.B.:
$beträge = array();
$betrag[] = array('2010-09-15','20.00','Einnhame');
$betrag[] = array('2010-08-01','-30.00','Ausgabe');
$betrag[] = array('2009-05-21','20.00','Einnahme');
und nun möchte ich zur Ausgabe das ganze nach Datum sortieren.
Vielen Dank für Eure Anstrengungen
Eure Dusi
PS: habe mir die Funktion array_multisort angeschaut, vertehe sie aber irgendwie nicht, bzw. weiss ich nicht wie ich dann auf das Datum als Ordnungskritik angebe.
PS: habe mir die Funktion array_multisort angeschaut, vertehe sie aber irgendwie nicht, bzw. weiss ich nicht wie ich dann auf das Datum als Ordnungskritik angebe.
Beispiel 3 solltest du dir nochmal näher ansehen - das entspricht ziemlich exakt dem, was du vor hast.
btw, ich prophezeie: Sven Rautenberg wird kommen und dir dir sagen, dass es technisch noch bessere Lösungen gibt.
Aber Beispiel 3 in der array_multisort()-Doku ist jedenfalls ausreichend.
Aber Beispiel 3 in der array_multisort()-Doku ist jedenfalls ausreichend.
Dankeschön,
wie es sooft ist, habe ich es nach absenden der Nachricht dann auch verstanden.
Finde die Funktion irgendwie verwirrend.
Vielen Dank nochmal für Deine Antwort und dann warten wir mal ab, ob der Herr Rautenberg vielleicht noch eine andere Lösung hat.
Gruß und gutes nächtle
Dusi
Hi!
PS: habe mir die Funktion array_multisort angeschaut, vertehe sie aber irgendwie nicht, bzw. weiss ich nicht wie ich dann auf das Datum als Ordnungskritik angebe.
Beispiel 3 solltest du dir nochmal näher ansehen - das entspricht ziemlich exakt dem, was du vor hast.
btw, ich prophezeie: Sven Rautenberg wird kommen und dir dir sagen, dass es technisch noch bessere Lösungen gibt.
Da halte ich gegen;) Sven mischt sich i.d.R. nicht ein, wenn zuvor bereits eine passende Lösung kommuniziert wurde.
off:PP
Moin!
btw, ich prophezeie: Sven Rautenberg wird kommen und dir dir sagen, dass es technisch noch bessere Lösungen gibt.
Da halte ich gegen;)
Verloren. ;)
Sven mischt sich i.d.R. nicht ein, wenn zuvor bereits eine passende Lösung kommuniziert wurde.
array_multisort() ist niemals eine "passende" Lösung. Diese Funktion ist die Ausgeburt an "Fail" - und zwar nicht PHP-seitig, sondern datengestaltungsseitig beim Programmierer. Wer gezwungen ist, zu dieser Funktion zu greifen, hat PHP-Arrays nicht oder nur halb verstanden.
Dabei hat es diese Datenstruktur wirklich verdient, ausgiebig zum eigenen Vorteil genutzt zu werden, denn sowas bieten andere beliebte Programmiersprachen IIRC nicht.
- Sven Rautenberg
btw, ich prophezeie: Sven Rautenberg wird kommen und dir dir sagen, dass es technisch noch bessere Lösungen gibt.
Da halte ich gegen;)
Verloren. ;)
WIN :)
Hi!
btw, ich prophezeie: Sven Rautenberg wird kommen und dir dir sagen, dass es technisch noch bessere Lösungen gibt.
Da halte ich gegen;)
Verloren. ;)
WIN :)
OK!
off:PP
Moin!
Ich bekomme aus verschiedenen Tabellen Beträge, der Aufbau der Tabellen ist aber immer anders. Teilweise muss ich die Beträge erst errechnen, teilweise stehen sie direkt so in der Datenbank.
Nun möchte ich eine Art Kontoübersicht bauen, wo also Einnahmen und Ausgaben nach Datum sortiert sind.
Dann solltest du die Daten also immer gleichartig in ein Array hineintun. Und zwar so, dass du die dabei entstehende Datenstruktur vernünftig auslesen, sortieren und insgesamt für deine Zwecke nutzen kannst.
Ich hatte mir nun überlegt, das ich die Daten dann in ein mehrdimensoniales Array schreibe nach dem Schema:
Datum - Betrag - Bezeichnung(woher der betrag kommt)
Das ist für die Praxis nicht ganz so toll, weil deine nächste Anforderung nach dem Speichern ja das Sortieren ist.
Wenn dein Array wirklich nur nach Datum sortiert werden soll, würde sich anbieten, eben dieses Datum als Key für die erste Arrayebene zu verwenden, und die möglichen mehreren Buchungen eines Tages als Elemente der zweiten Array-Ebene.
$buchung = array(
'2010-04-10' => array(
array(
'betrag' => 12,
'betreff' => 'Einnahme',
),
),
'2010-04-12' => array(
array(
'betrag' => 24,
'betreff' => 'Einnahme',
),
array(
'betrag' => -31,
'betreff' => 'Ausgabe',
),
),
);
(Anmerkung: Die überzähligen Kommas sind Absicht in dieser Schreibweise - sie sind syntaktisch erlaubt, und wenn man ein Array erweitert, muss man sie nicht manuell extra hinzufügen.)
Das Array erzeugt man sich, indem man sowas woe folgenden Code benutzt:
if (!isset($buchung[$datum])) {
$buchung[$datum] = array();
}
$buchung[$datum][] = array('betrag' => $betrag, 'betreff' => $betreff);
Ausgabe nach der Sortierung:
foreach ($buchung as $datum => $tagesbuchungen) {
foreach ($tagesbuchungen as $einzelbuchung) {
echo $einzelbuchung['betrag'];
echo $einzelbuchung['betreff'];
}
}
Die Sortierung des einmal fertig befüllten Arrays übernimmt dir die Funktion ksort().
Jetzt kann's aber sein, dass du der Meinung bist, nicht nur nach Datum sortieren zu müssen, sondern auch mal nach Betrag, oder nach Betreff. Oder nach sonst einem Wert, den du noch zusätzlich ins Array getan hast. Da wäre die Sortierung nach Datum im obersten Array dann ziemlich falsch - und sehr große Datenmengen direkt doppelt in mehreren Arrays zu halten ist auch keine so gute Idee.
Da kommt dir dann die Eigenschaft von PHP-Arrays zugute, die diese Datenstruktur nicht wirklich als Array auffasst, sondern eher als verkettete Liste, d.h. die einzelnen Elemente haben nicht nur eine Position aufgrund ihres Array-Keys, sondern auch aufgrund ihrer Sortierung. Wenn der Array-Key keine Zahl ist, dann interessiert einen das nicht wirklich, weil man bei assoziativen Arrays sowieso keine aufsteigend zählbare Reihenfolge erwartet. Aber die innere Abfolge der Elemente gilt auch für Arrays mit numerischem Index, und genau das machen wir uns mal zunutze:
// Aufbauen
$i = 1;
$buch['datum'][$i] = '2010-04-10';
$buch['betrag'][$i] = 23;
$buch['betreff'][$i] = 'Einnahme';
$i++;
$buch['datum'][$i] = '2010-04-07';
$buch['betrag'][$i] = -3;
$buch['betreff'][$i] = 'Ausgabe';
$i++;
$buch['datum'][$i] = '2010-04-12';
$buch['betrag'][$i] = 10;
$buch['betreff'][$i] = 'Einnahme';
// Fertig.
// Datumsarray sortieren nach Datum - dabei den zweiten, numerischen Schlüssel unbedingt beibehalten!
asort($buch['datum']);
// Betragsarray sortieren nach Betrag
asort($buch['betrag']);
//Betreff-Array gar nicht sortieren. :)
// Ausgabe
// Sortiert nach Datum
foreach ($buch['datum'] as $id => $datum) {
echo $buch['datum'][$id] .": ". $buch['betrag'][$id] ." EUR für ". $buch['betreff'][$id];
}
// Sortiert nach Betrag
foreach ($buch['betrag'] as $id => $datum) {
echo $buch['datum'][$id] .": ". $buch['betrag'][$id] ." EUR für ". $buch['betreff'][$id];
}
// nicht sortiert nach Betreff
foreach ($buch['betreff'] as $id => $datum) {
echo $buch['datum'][$id] .": ". $buch['betrag'][$id] ." EUR für ". $buch['betreff'][$id];
}
Bemerke die Gleichheit der jeweils ausgebenden Zeile! Die Wahl, welche Sortierung jeweils benutzt wird, entscheidet sich ausschließlich nach dem Array, welches an foreach übergeben wird. foreach ist es als Schleife egal, welche Array-Keys verwendet werden, es geht ausschließlich nach der internen Reihenfolge der Array-Elemente.
PS: habe mir die Funktion array_multisort angeschaut, vertehe sie aber irgendwie nicht, bzw. weiss ich nicht wie ich dann auf das Datum als Ordnungskritik angebe.
Wann immer du array_multisort() verwenden zu müssen glaubst, bist du in der Regel auf dem Holzweg, oder du hast einen echt seltenen und sehr traurigen Fall von extrem mangelhafter Datenstrukturierung in deinem Array, den du auch nicht durch neu anordnen oder Verändern der Datenquelle lösen kannst. Sowas willst du in der Regel aber vermeiden - und es ist ja auch problemlos möglich.
- Sven Rautenberg
Hello,
den Link zu den Universalfunktionen für Select, Insert, Update, Delete aus dem Array füge ich noch hinzu:
http://forum.de.selfhtml.org/archiv/2009/5/t187244/#m1244374
weitere Diskussionen zum Thema:
http://forum.de.selfhtml.org/archiv/2009/9/t191001/#m1274145
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg