Array sortieren und counten
Anja
- php
2 dedlfix1 Jörg Reinholz0 Anja
0 hotti
Hallo,
ich habe ein Array, welches ich über einen Json-Dienst abfrage und in PHP decode:
$phpJsonString = file_get_contents( $jsonData );
$data = json_decode( $phpJsonString );
$data sieht dann z.B. so aus:
Array
(
[1] => stdClass Object
(
[datum] => 16.10.2012
[id] => 50101776
)
[2] => stdClass Object
(
[datum] => 19.05.2012
[id] => 50110056
)
[3] => stdClass Object
(
[datum] => 02.03.2012
[id] => 50110197
)
[4] => stdClass Object
(
[datum] => 19.05.2012
[id] => 50112834
)
)
Ich suche nun nach einer eleganten Methode das Array nach dem Datum zu sortieren und gleichzeitig Objekte mit gleichem Datum (hier z.b. [2] und [4] ) zusammenzufassen:
am Besten wäre als Ziel array sowas:
Array
(
[1] => stdClass Object
(
[datum] => 02.03.2012
[count] => 1
)
[2] => stdClass Object
(
[datum] => 19.05.2012
[count] => 2
)
[3] => stdClass Object
(
[datum] => 16.10.2012
[count] => 1
)
)
Kann mir hier jemand den richtigen Weg aufzeigen bzw. eine Klasse nennen die sowas einfach erledigt?
Besten Dank
Anja
Tach!
Ich suche nun nach einer eleganten Methode das Array nach dem Datum zu sortieren und gleichzeitig Objekte mit gleichem Datum (hier z.b. [2] und [4] ) zusammenzufassen:
Elegant ist nicht, einen Einzeiler zu schreiben, der alles auf einmal zu erledigen versucht, den man aber nicht mehr warten kann. Separiere die beiden Anliegen. Erst zusammenfassen, dann mit einer der u*sort()-Funktionen sortieren. Oder auch zuerst sortieren, dann drüberlaufen und nach dem Gruppenwechsel-Prinzip zusammenfassen. Wenn unterschiedlich zum Vorgänger, dann das Element in das Zielarray kopieren, ansonsten den Zähler erhöhen.
Kann mir hier jemand den richtigen Weg aufzeigen bzw. eine Klasse nennen die sowas einfach erledigt?
Es gibt nicht für jedes Vorhaben bereits fertige Lösungen. Besondern dann nicht, wenn die zu bearbeitende Datenstruktur über ein einfaches flaches Array hinausgeht.
dedlfix.
Array
(
[1] => stdClass Object
(
[datum] => 16.10.2012
[id] => 50101776
)
[2] => stdClass Object
(
[datum] => 19.05.2012
[id] => 50110056
)
[3] => stdClass Object
(
[datum] => 02.03.2012
[id] => 50110197
)
[4] => stdClass Object
(
[datum] => 19.05.2012
[id] => 50112834
)
)
>
> Ich suche nun nach einer eleganten Methode das Array nach dem Datum zu sortieren und gleichzeitig Objekte mit gleichem Datum (hier z.b. [2] und [4] ) zusammenzufassen:
>
> am Besten wäre als Ziel array sowas:
> ~~~html
>
> Array
> (
> [1] => stdClass Object
> (
> [datum] => 02.03.2012
> [count] => 1
> )
>
> [2] => stdClass Object
> (
> [datum] => 19.05.2012
> [count] => 2
> )
> [3] => stdClass Object
> (
> [datum] => 16.10.2012
> [count] => 1
> )
> )
>
>
Das sieht nicht brauchbar aus. Wer macht oder will denn macht sowas?
$arTermine=array();
foreach ($data as $ar) {
// brauchbares Datumsformat herstellen:
list($d, $m, $y)=explode('.', $ar['datum']);
$datum="$y-$m-$d";
// umfummeln
if (! isset $arTermine[$datum]) {
$arTermine[$datum]=1;
} else {
$arTermine[$datum]++;
}
//sortieren:
ksort ($arTermine);
}
Fehlerchen vorbehalten.
$arTermine sollte jetzt enthalten was Du suchst. Sieht dann so aus:
$arTermine
Array (
[2012-03-02] => 1
[2012-15-19] => 2
[2012-10-16] => 1
)
Du bekommst also ein bequem zu händelndes, schön flaches assoziatives Array. An die Werte kommst Du mit array_keys(), foreach und so weiter.
Die Ausgabe des Datums mache mit etwas wie:
<?php
function getMyGermanDatum($isoDatum) {
return date_format(date_create($isoDatum), 'd.m.Y');
}
?>
Vielen dank, so sollte es mein problem lösen
hi,
am Besten wäre als Ziel array sowas:
Array
(
[1] => stdClass Object
(
[datum] => 02.03.2012
[count] => 1
)[2] => stdClass Object
(
[datum] => 19.05.2012
[count] => 2
)
[3] => stdClass Object
(
[datum] => 16.10.2012
[count] => 1
)
)
Noch besser wäre, weil das Datum ja eindeutig ist, ein Array mit dem Datum als Schlüssel und als Werte die Anzahl der Einträge. Wie wär's damit?
Hotti