Anja: Array sortieren und counten

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

  1. 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.

  2. 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');  
    }  
    ?>
    

    Jörg Reinholz

    1. Vielen dank, so sollte es mein problem lösen

  3. 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