tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
682
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    webbudda webbudda ist offline Mitglied Bronze
    Registriert seit
    Sep 2009
    Beiträge
    46
    Hallo,

    ich habe ein XMLfile folgender Art:

    Code :
    1
    2
    3
    
    <markers>
    <marker entry="149"  eintrag="2009-10-10 16:35:52" ... />
    <markers>

    Jetzt möchte ich die "neusten" 5 Einträge darstellen. Folgenden Code habe ich bisher:
    PHP-Code:
    $xml simplexml_load_file("data.xml");
    for(
    $i 0$i 5$i++)
      {
    $att $xml->marker[$i]->attributes();

    echo 
    $att['entry'];

      } 
    Ich steh gerade auf dem Schlauch und weiss nicht so recht, die ich die Abfrage der 5 neusten Einträge gestallten kann.

    Jemand eine idee?
     

  2. #2
    Avatar von Flex
    Flex Flex ist offline (aka Felix Jacobi)
    tutorials.de Moderator
    Registriert seit
    Nov 2001
    Ort
    Wuppertal
    Beiträge
    5.295
    Blog-Einträge
    65
    Auch wenn du es in eine andere Variable speicherst, bleibt es ein Objekt und wird nicht zu einem Array.

    PHP-Code:
    <?php

    $str 
    '<markers>
        <marker entry="149"  eintrag="2009-10-10 16:35:52" />
        <marker entry="151"  eintrag="2009-10-10 16:35:52"/>
        <marker entry="152"  eintrag="2009-10-10 16:35:52"/>
        <marker entry="153"  eintrag="2009-10-10 16:35:52"/>
        <marker entry="154"  eintrag="2009-10-10 16:35:52"/>
    </markers>'
    ;

    $xml simplexml_load_string($str);

    for(
    $i 0$i 5$i++)
    {
        
    $attributes $xml->marker[$i]->attributes();
        
        echo 
    $attributes->entry.'<br/>';
    }
    ?>
     
    KIDS Kinderbetreuungsdienst
    Xing

    "When you play the game of thrones, you win or you die. There is no middle ground."
    by Cersei Lannister in "A Game Of Thrones"

  3. #3
    webbudda webbudda ist offline Mitglied Bronze
    Registriert seit
    Sep 2009
    Beiträge
    46
    Funktioniert hatte es trotzdem, aber danke.

    Wie kann ich denn jetzt am einfachsten die 5 neusten rausziehen?
     

  4. #4
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Hi!

    Das Zauberwort heißt usort(). Ich glaube der einfachste Weg ist das gesamte Array $xml->marker zu durchlaufen und mal eben usort() 'drüber zu jagen, allerdings wirst Du die Funktion zum Vergleichen selber basteln müssen:
    Code PHP:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    <?php
     
    $str = <<<EOT
    <markers>
     <marker entry="149"  eintrag="2007-10-10 16:35:52"/>
     <marker entry="151"  eintrag="2009-10-10 16:35:00"/>
     <marker entry="152"  eintrag="2009-10-10 16:30:52"/>
     <marker entry="153"  eintrag="2003-11-10 15:35:52"/>
     <marker entry="154"  eintrag="2009-10-10 16:35:52"/>
     <marker entry="149"  eintrag="2007-10-10 16:35:52"/>
     <marker entry="151"  eintrag="2009-10-10 16:33:00"/>
     <marker entry="152"  eintrag="2007-10-10 16:30:52"/>
     <marker entry="153"  eintrag="2009-11-10 16:35:52"/>
     <marker entry="154"  eintrag="2004-10-10 16:35:52"/>
    </markers>
    EOT;
     
    $xml = simplexml_load_string($str);
     
    function sort_callback($a, $b)
    {
        if($a->eintrag == $b->eintrag)
        {
            return 0;
        }
     
        $a = strtotime($a->eintrag);
        $b = strtotime($b->eintrag);
     
        return $a > $b? 1: -1;
    }
     
    for($i=count($xml->marker); $i;)
    {
        $data[] = $xml->marker[--$i]->attributes();
    }
     
    unset($xml);
    usort($data, sort_callback);
     
    for($i=0; $i!=5; ++$i)
    {
        echo $data[$i]->eintrag, ": ", $data[$i]->entry, "\n";
    }

    Ach ja, die Schleife in den Zeilen 33 bis 35 hat nicht nur den Zweck die Attribute schon vorher zu extrahieren (was einen Performance-Gewinn sein müsste), sondern auch ein Problem im SimpleXMLElement zu umgehen: Das Array $xml->marker würde von usort() zwar sortiert werden, allerdings wäre nach der Operation die Sortierung wieder verloren. Die Ursache kann man sich ausmalen...

    Gruß
    Enum

    [EDIT]
    Ok, usort() basiert nicht (mehr?) auf Quicksort.
    Geändert von Enumerator (27.10.09 um 12:26 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  5. #5
    webbudda webbudda ist offline Mitglied Bronze
    Registriert seit
    Sep 2009
    Beiträge
    46
    Danke. Irgendwie klappt das mit folgendem XML nicht.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <markers>
    <marker entry="149" eintrag="2009-10-10 16:35:52"  />
    <marker entry="150" eintrag="2009-10-11 13:09:07"  />
    <marker entry="151" eintrag="2009-10-11 13:35:02" />
    <marker entry="152" eintrag="2009-10-13 20:01:50" />
    <marker entry="153" eintrag="2009-10-21 15:50:59" />
    <marker entry="154" eintrag="2009-10-21 15:53:39" />
    <marker entry="155" eintrag="2009-10-21 16:01:23" />
    <marker entry="156" eintrag="2009-10-21 16:10:30"/>
    <marker entry="157" eintrag="2009-10-21 16:17:30"/>
    <marker entry="158" eintrag="2009-10-21 16:18:30"/>
    <marker entry="159" eintrag="2009-10-21 16:19:30"/>
     
    </markers>
    ,

    Er kommt dabei mit den gleichen tagen nicht klar. Hm..
    Geändert von webbudda (28.10.09 um 18:42 Uhr)
     

  6. #6
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Moin,

    hast du evtl. libxslt verfügbar?
    Das, was du so mit dem XML vorhast, schreit geradezu nach XSL!
     

  7. #7
    webbudda webbudda ist offline Mitglied Bronze
    Registriert seit
    Sep 2009
    Beiträge
    46
    Keine Ahnung. Der Kram liegt bei Strato.

    Kann man das o.g. Beispiel nicht etwas modifizieren?
     

  8. #8
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Zitat Zitat von webbudda Beitrag anzeigen
    Danke. Irgendwie klappt das mit folgendem XML nicht.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    <markers>
    <marker entry="149" eintrag="2009-10-10 16:35:52"  />
    <marker entry="150" eintrag="2009-10-11 13:09:07"  />
    <marker entry="151" eintrag="2009-10-11 13:35:02" />
    <marker entry="152" eintrag="2009-10-13 20:01:50" />
    <marker entry="153" eintrag="2009-10-21 15:50:59" />
    <marker entry="154" eintrag="2009-10-21 15:53:39" />
    <marker entry="155" eintrag="2009-10-21 16:01:23" />
    <marker entry="156" eintrag="2009-10-21 16:10:30"/>
    <marker entry="157" eintrag="2009-10-21 16:17:30"/>
    <marker entry="158" eintrag="2009-10-21 16:18:30"/>
    <marker entry="159" eintrag="2009-10-21 16:19:30"/>
     
    </markers>
    ,

    Er kommt dabei mit den gleichen tagen nicht klar. Hm..
    Bei mir spuckt er da Folgendes aus:
    Code :
    1
    2
    3
    4
    5
    
    2009-10-10 16:35:52: 149
    2009-10-11 13:09:07: 150
    2009-10-11 13:35:02: 151
    2009-10-13 20:01:50: 152
    2009-10-21 15:50:59: 153
    Wenn ich nicht allzu müde bin, ist das doch vollkommen richtig, oder
    Natürlich sind das die Ältesten Einträge. Um auf die jüngsten zu kommen, kannst Du entweder dir Rückgabewerte von sort_callback vertauschen oder $data von hinten an den Kragen gehen...

    Gruß
    Enum

    PS:
    Wenn das XML immer so aussieht wie oben, sprich wenn die jüngsten Einträge ganz unten und die ältesten ganz oben sind, würde ich auf eine Sortierung vollkommen verzichten und stattdessen mit dem XML-Baum arbeiten:
    PHP-Code:
    $str '<markers>
    <marker entry="149" eintrag="2009-10-10 16:35:52"  />
    <marker entry="150" eintrag="2009-10-11 13:09:07"  />
    <marker entry="151" eintrag="2009-10-11 13:35:02" />
    <marker entry="152" eintrag="2009-10-13 20:01:50" />
    <marker entry="153" eintrag="2009-10-21 15:50:59" />
    <marker entry="154" eintrag="2009-10-21 15:53:39" />
    <marker entry="155" eintrag="2009-10-21 16:01:23" />
    <marker entry="156" eintrag="2009-10-21 16:10:30"/>
    <marker entry="157" eintrag="2009-10-21 16:17:30"/>
    <marker entry="158" eintrag="2009-10-21 16:18:30"/>
    <marker entry="159" eintrag="2009-10-21 16:19:30"/>
    </markers>'
    ;

    $xml simplexml_load_string($str);

    for(
    $i=count($xml->marker), $j=$i-5$j!=$i; --$i)
    {
        
    $attributes $xml->marker[$i]->attributes();
        echo 
    $attributes->entry.'<br/>';

    Geändert von Enumerator (28.10.09 um 19:08 Uhr)
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  9. #9
    Avatar von Sven Mintel
    Sven Mintel Sven Mintel ist offline Mitglied
    Registriert seit
    Aug 2003
    Beiträge
    18.238
    Blog-Einträge
    6
    Zitat Zitat von webbudda Beitrag anzeigen
    Keine Ahnung. Der Kram liegt bei Strato.
    Hab mal nachgeguckt, es scheint, als hätte STRATO etwas gegen XSL
     

Ähnliche Themen

  1. Antworten: 11
    Letzter Beitrag: 04.09.09, 17:36
  2. SimpleXML
    Von PHPGuru86 im Forum PHP
    Antworten: 2
    Letzter Beitrag: 31.03.09, 21:56
  3. (SimpleXML)
    Von Sarah im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.02.08, 10:08
  4. PHP & SimpleXML
    Von PersonalDemon im Forum PHP
    Antworten: 5
    Letzter Beitrag: 04.10.07, 14:36
  5. SimpleXML und DTD
    Von bandsite im Forum PHP
    Antworten: 1
    Letzter Beitrag: 03.08.06, 20:49