XML & PHP: Sortierreihenfolge?

garraty47

Aktives Mitglied
Thread Starter
Dabei seit
18.11.2004
Beiträge
547
Reaktionspunkte
5
Ich frage mich ob man beim ausgeben von XML-Inhalten in PHP auch Sortierkriterien angeben kann?
Bei meinem derzeitigen Skript wird einfach der Baum von Anfang bis Ende durchlaufen, und das ist auch die Reihenfolge die ausgegeben wird.
Wie kann ich z.B. nach $xml->id sortieren lassen?
(wobei $xml die per SimpleXML geladene Datei als Objekt ist und $xml->id die id jedes Elements im baum)
 
ich weiss nicht ob dir das weiterhilft ...

ein *.xls hat eine sortierfunktion für ein *.xml

z.b.:
HTML:
<xsl:apply-templates select="bot">
<xsl:sort select="allow" order="ascending" />
<xsl:sort select="agent" order="ascending" />
</xsl:apply-templates>

(weiss der geier, warum die forensoftware die umbrüche nicht macht :confused: :confused: )
 
Das einfachst wäre, wenn deine xml-Dateien ID + .xml heißen (... und ID eine Zahl ist).
 
wobei dann ja immer noch keine sortierung möglich ist ausser nach id und absteigend, oder?
ich möchte ja auch nach datum oder anderen kriterien sortieren können.
gibt es da möglichkeiten?
 
ne, ist leider ein objekt, und ich bin wohl zu doof es in ein array zu überführen.
(ist doch ein objekt wenn ich es mit $variablenname->feldname ansprechen kann?)
 
Wie durchläufst du die XML-Daten im Moment?
 
Code:
  $xml = simplexml_load_file($filename);
     foreach( $xml as $xml_erg){
echo $xml_erg->id;}
so im prinzip.
und ich sprech dann halt über $xml_erg->"wasichwill" die ganzen felder an die ich brauche.
 
Wie kommst du an die Variable $filename? Das kann ja eigentlich nur funktionieren, wenn du den Verzeichnisinhalt ausliest, z.B. mit readdir.

so könntest du z.B. den Array erzeugen:
PHP:
if ($handle = opendir ('/path/to/files')) 
{
   while (false !== ($file = readdir ($handle))) 
   {
      if ($file && strpos ($file, '.') !== 0)) 
      {
         $xml = simplexml_load_file('/path/to/files/'.$file); 
         
         foreach ($xml as $xml_erg)  
         
         $xmldaten_array[$file] = array ('id' => $xml_erg->id, 'wasichwill' => $xml_erg->wasichwill, etc.);          
      }
   }
   closedir ($handle);
}
Wie man array_multisort anwenden könnte, wäre hier vielleicht etwas zu kompliziert, deshalb ein einfacher Vorschlag:
Du fügst beim erzeugen des Arrays deinen Sortierschlüssel statt $file ein, z.B.:
PHP:
$xmldaten_array[(substr ($xml_erg->wasichwill, 0, 20).'-'.(int)$counter++)]  = array (...);

// '-'.(int)$counter++ gewährleistet, dass keys nicht identisch sind)
und sortierst dann den Array mit ksort oder krsort bevor du ihn über "if (count ($xmldaten_array)) foreach " ausgibst.

"substr ($xml_erg->wasichwill, 0, 20)" könnte man bei Bedarf in eine Funktion fassen (make_sortkey()), in der z.B. auch noch Umlaute in ASCII umgewandelt werden oder Sonderzeichen ersetzt werden, je nach Wert, der den Schlüssel erzeugt; hier gehts im Moment nur darum den key in der Länge zu begrenzen.

Und noch eine Überlegung: Wenn du ein MySQL-Datenbank hast, könntest du ja auch die xml-Files in eine Tabelle aufdröseln und von dort sortiert auslesen, denn einen Schwachpunkt hat die beschriebene Vorgehensweise mit Array natürlich - ab einer bestimmten Datenmenge ist Schluss.
 
Zuletzt bearbeitet:
ok, ich probier's bei gelegenheit aus.
 
Zuletzt bearbeitet:
Du kannst natürlich den Sortier-Array klein halten, indem du die Dateien zweimal öffnest, Beim ersten Mal greifst du dir nur die Zeile, aus der der Schlüssel gebildet werden soll, und hängst als Wert den Dateinamen dran. Dann ksort und über foreach Dateien öffnen, ausgeben.
 
Zurück
Oben Unten