Hi!
Kennst Du die PHP-Funktion xml_parse_into_struct ?
Ja
In der zurückgegebenen Struktur steht die Tiefe des XML-Tags direkt im Array-Index 'level', d.h. man braucht keine Rekursion zum Durchlaufen der Einträge, die Tiefe wird also nicht durch Verschachtelung repräsentiert. Damit würde sich auch Deine Stuktur vereinfachen lassen, etwa
array(
array(
'level' => 0, // Ebene (Verschacheltungstiefe)
'pos' => 0, // Position (Reihenfolge)
'type' => 'folder' (Art des Elements)
'name' => 'test', (Name, bzw. ID)
// weitere Informationen
),
);
Also ich mag diese Funktion nicht so besonders, was mir gefallen könnte wäre simplexml (http://de3.php.net/manual/de/ref.simplexml.php), gibts leider erst in PHP5. Das Problem bei XML ist schonmal, dass es sehr langsam wird wenn die Datei etwas größer wird, da PHP immer die gesamte XML-Datei verarbeiten muss, und XML ist auch recht komplex, so dass die von PHP verwendeten XML-Parser auch nicht gerade schnell sind. Natürlich wäre eine Datenhaltung in Form von XML nicht schlecht, aber gerade dann bräuchte ich in jedem Fall einen PHP-Array der gecached wird. Gut, da könnte man dann auch direkt den von xml_parse_into_struct() erzeugten Array nehmen, das ganze kann man ja gut anpassen, allerdings weißich nicht ob man auf diese Weise auch einen einen oder mehrere Arrays hinbekommt, die sich schön effektiv abfragen lassen. Effektiv heißt für mich, dass ich imer wo möglich Daten _direkt_ lesen kann, also $var = $array[$_GET['bla']... und nicht erst foreach ($array as $val) if ($val['bla']==$_GET['bla'])...
Im Moment sehe ich die Datenbank-Version mit Vater-ID als die effizienteste. Das doofe an der Geschichte - ich will das ganze auch nutzen können, wenn ich keine Datenbank habe (man, ich will PHP5 mit simplexml und/oder sqlite ;-))
Hierzu ist XML natürlich eine Möglichkeit. Ich versuche es erstmal mit reinen PHP-Arrays. Sicher ist das kein besonders portables Format, aber eine Import/Export-Schnittstelle kann ja unabhängig von der Datenhaltung funktionieren.
Ich hab mir jetzt Folgendes überlegt:
Struktur:
1 Hardware
2 System
5 Server
4 Cluster-Rechner
3 Mainframe
Arrays:
$titles = array (
1 => 'Hardware',
2 => 'System',
3 => 'Mainframe',
4 => 'Cluster-Rechner',
5 => 'Server'
);
$parend_ids = array (
1 => 0,
2 => 1,
3 => 2,
4 => 2,
5 => 2
);
$sort_ids = array (
1 => array (2),
2 => array (5,4,3),
);
Ich denke damit speichere ich alle relevanten Informationen - wenn teilweise auch redundant(wie ein Index halt), aber dafür kann ich die Daten so recht effektiv abfragen.
Jetzt kann ich anhand einer gegebenen ID (z.B. 2) den Baum sehr schnell erzeugen.
- mit $parend_ids[2] frage ich die Parent ID ab(evtl. rekursiv oder in einer Schleife, bis zum Root-Element, sind in der Praxis vielleicht im Schnitt 4 Ebenen, maximal vielleicht 10 oder 12)
Und dann kann ich mit foreach($sort_ids[2] as $id) {...} sehr einfach alle Elemente in einer Kategorie ausgeben. Das gute hieran, mit array_splice() kann ich die IDs hier so Anordnen wie ich lustig bin. IM Prinzip bräuchte ich auch 3 Arrays, selbst wenn ich die Reihenfolge nicht beeinflussen wollte, nur könnte ich das dann in diesem Fall evtl. etwas effizienter machen, durch den Array wie im ersten Posting beschrieben - diese würde nicht linear durchlaufen, sondern die Elemente würde direkt durch alle Parent-IDs der gesuchten Kategorie bestimmt. Auf der anderen Seite dürfte ein Array der als Opcode im RAM gehalten wird, schneller abzufragen sein als jeder DB-Index, also halb so wild IMHO.
Die Elemente gebe ich dann in Form von "echo $titles[$id]" aus.
Der größte Array würde wohl der mit den Titeln werden, die anderen verhältnismäßig klein. Das speichere ich dann entweder per serialize, oder evtl. sogar mit meiner in [pref:t=78998&m=457720] beschriebenen Methode in ausführbaren PHP-Dateien.
Was haltet Ihr von dieser Methode?
Viele Grüße
Andreas
SELFHTML Tipps & Tricks: http://aktuell.de.selfhtml.org/tippstricks/