Rolf: Differenz zum nächsten Element berechnen

Hallo,

gegeben ist folgendes Array:

<?php  
$DTN = array(  
    '02.09.2006' => array(20.00, 'Starterset'),  
    '16.10.2006' => array(15.00, '602067'),  
    '29.11.2006' => array(15.00, '733139'),  
    '17.01.2007' => array(15.00, '953110'),  
    '24.02.2007' => array(15.00, '1146021'),  
    '12.03.2007' => array(15.00, '1233024'),  
    '07.05.2007' => array(15.00, '1564098'),  
    '06.07.2007' => array(15.00, '2010120'),  
    '01.10.2007' => array(15.00, '2760485'));  
?>

Selbiges soll in einer Tabelle angezeigt und dabei auch der Abstand zum nächsten Element in Tagen ausgegeben werden. Das mit der Anzeige klappt bestens in einer foreach-Schleife und das Berechnen der Tage ist eigentlich auch kein Problem, nur eben nicht schon in der Zeile davor:
+------------+--------+----------+------+
| Datum      | Betrag | Re.-Nr.  | Tage |
+------------+--------+----------+------+
| 02.09.2006 |  20,00 | Startset |   44 |
| 16.10.2006 |  15,00 |   602067 |   44 |
| 29.11.2006 |  15,00 |   733139 |   48 |
| 17.01.2007 |  15,00 |   953110 |   39 |
| 24.02.2007 |  15,00 |  1146021 |   16 |
| 12.03.2007 |  15,00 |  1233024 |   55 |
| 07.05.2007 |  15,00 |  1564098 |   60 |
| 06.07.2007 |  15,00 |  2010120 |   87 |
| 01.10.2007 |  15,00 |  2760485 |      |
+------------+--------+----------+------+
Also: Wie greift man auf den Key des nächsten SubArrays zu ?

mbG Rolf

  1. Moin!

    gegeben ist folgendes Array:

    Das ist aber nicht so strukturiert, dass du die gestellte Aufgabe wirklich lösen könntest. Stelle um.

    <?php

    $DTN = array(
        '02.09.2006' => array(20.00, 'Starterset'),
        '16.10.2006' => array(15.00, '602067'),
        '29.11.2006' => array(15.00, '733139'),
        '17.01.2007' => array(15.00, '953110'),
        '24.02.2007' => array(15.00, '1146021'),
        '12.03.2007' => array(15.00, '1233024'),
        '07.05.2007' => array(15.00, '1564098'),
        '06.07.2007' => array(15.00, '2010120'),
        '01.10.2007' => array(15.00, '2760485'));
    ?>

      
    Alternativ gibts natürlich auch noch Funktionen wie next() und prev(), aber ob es sehr schlau ist, auch noch mit einem Arraypointer in einem foreach rumzufummeln, würde ich bezweifeln.  
      
     - Sven Rautenberg
    
    -- 
    "Love your nation - respect the others."
    
  2. Hello,

    <?php

    $DTN = array(
        '02.09.2006' => array(20.00, 'Starterset'),
        '16.10.2006' => array(15.00, '602067'),
        '29.11.2006' => array(15.00, '733139'),
        '17.01.2007' => array(15.00, '953110'),
        '24.02.2007' => array(15.00, '1146021'),
        '12.03.2007' => array(15.00, '1233024'),
        '07.05.2007' => array(15.00, '1564098'),
        '06.07.2007' => array(15.00, '2010120'),
        '01.10.2007' => array(15.00, '2760485'));
    ?>

    
    > Selbiges soll in einer Tabelle angezeigt und dabei auch der Abstand zum nächsten Element in Tagen ausgegeben werden. Das mit der Anzeige klappt bestens in einer foreach-Schleife und das Berechnen der Tage ist eigentlich auch kein Problem, nur eben nicht schon in der Zeile davor:  
      
    
    > +------------+--------+----------+------+  
    > | Datum      | Betrag | Re.-Nr.  | Tage |  
    > +------------+--------+----------+------+  
    > | 02.09.2006 |  20,00 | Startset |   44 |  
    > | 16.10.2006 |  15,00 |   602067 |   44 |  
    > | 29.11.2006 |  15,00 |   733139 |   48 |  
    > | 17.01.2007 |  15,00 |   953110 |   39 |  
    > | 24.02.2007 |  15,00 |  1146021 |   16 |  
    > | 12.03.2007 |  15,00 |  1233024 |   55 |  
    > | 07.05.2007 |  15,00 |  1564098 |   60 |  
    > | 06.07.2007 |  15,00 |  2010120 |   87 |  
    > | 01.10.2007 |  15,00 |  2760485 |      |  
    > +------------+--------+----------+------+  
    > Also: Wie greift man auf den Key des nächsten SubArrays zu ?  
      
    Also erstens sehe ich da kein Echtzeitproblem. Du könntest also in aller Seelenruhe die Berechnung durchführen und dann später die Ausgabe. Das bendeutet, dass Du ein Arrayelement hinzufügen könntest für die Differenz.  
      
    Und zweitens sollte die Frage doch dann besser heißen: wie greift man nochmals auf den Key des letzten Elementes zu, obwohl man schon beim nächsten ist? Wie wäre es denn, sich den Key einfach zu merken?  
      
    ~~~php
      
    $_buchung = array()  
    $_buchung[$tag] = array();  
    $_buchung[$tag]['betrag']= 20;  
    $_buchung[$tag]['renr']= 'Startset';  
    $_buchung[$tag]['diff']= 0;  
      
      
    $oldtag = 0;  
      
    foreach($_buchung as $tag => $_data)  
    {  
        if (isset($_buchung[$oldtag]))  
        {  
            $_buchung[$oldtag]['diff'] = daydiff($oldtag, $tag);  
        }  
      
        ## hier zur Not die Ausgaben veranlassen  
      
      
        $oldtag = $tag;  
    }  
    
    

    daydiff() ist Deine Funktion für die Berechnung der Tagesdifferenz.  Da war ich eben zu faul nachzudenken, wie das geht :-)

    Ein harzliches Glückauf

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo,

      schade dass Euch auch nix eleganteres als zweimaliges Iterieren einfällt.
      Okay, dann muss es halt sein ... <schnief>

      mbG Rolf

      1. Hello,

        schade dass Euch auch nix eleganteres als zweimaliges Iterieren einfällt.

        Was soll denn der Blödinn?

        Ich habe Dir doch den Hinweis gegeben, wie es mit einem Durchlauf geht!

        Du gibst an der bezeichneten Stelle immer den Datansatz für $oldtag aus.
        Den letzten Datensatz gibst Du dann nach dem Ende der foreach()-Schleife aus, auh wieder, indem Du auf $_buchung[$oldtag] zugreifst.

        Es ist nur unsauber so vorzugehen.
        Datenbeschaffung, Datenverarbeitung, Datenformatierung und zum Schluss ide Ausgabe sollten bei Client-Server-Programmen, speziell bei solchen mit verbindungslosem Protokoll, immer sauber getrennt werden.

        Ein harzliches Glückauf

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          schade dass Euch auch nix eleganteres als zweimaliges Iterieren einfällt.
          Was soll denn der Blödinn?

          ist dieses Wort die Krone Deiner Argumente?
          Ein bissel Kontenance wäre hier sicher angebracht ... ;-)

          Im Prinzip hast Du ja Recht, auch wenn der Weg zur Hölle mit Prinzipien gepflastert sein soll.
          Und ansonsten widerstrebt es mir zutiefst, aus jedem Problemchen ein Softwareprojekt zu gestalten.
          Mit sinnlosem Formalismus lass sich die Kids beschäftigen, ich kenne angemehmere Tätigkeiten ... ;-)

          mbG Rolf