Algorithmus gesucht!

Hallo!

Ich suche einen Algorithmus zu folgendem Problem:

Ich möchte eine Liste mit z.B. folgenden Einträgen

node1
 node11
 node12
node2
 node21
 node211
 node22
node3
node4

in ein Array

array(
 "node1"=\>array(
 "node11"=\>null,
 "node12"=\>null
 ),
 "node2"=\>array(
 "node21"=\>array(
 "node211"=\>null
 ),
 "node22"=\>null
 )
 "node3"=\>null
 ),
 "node4"=\>null
 )
);

umwandeln. Dabei ist jedes Leerzeichen ein „Ebenenwechsel“.
Ich habe jetzt schon so lange herumprobiert, aber ich bekomme es einfach nicht hin.

Hat jemand zufällig so einen Algorithmus?

MFG, Volker

Hallo Volker,

lös dies mit einer rekursiven Funktion:

function list2array($filename, $depth=0) {
 static $line = 0;
 static $list = NULL;
 $result = NULL;
 if ($list == NULL) {
 $list = file($filename) or die('Could not open list-file '.$filename);
 }
 if (!isset($list[$line])) return NULL; 
 $actdepth = strlen($list[$line])-strlen(ltrim($list[$line]));
 if ($actdepth != $depth) {
 die('Error on line '.($line+1).' in '.$filename.
 ': expected '.$depth.' spaces but found '.$actdepth.'.');
 }
 do {
 $nextdepth = strlen($list[$line+1])-strlen(ltrim($list[$line+1]));
 if ($nextdepth == $depth) {
 $result[trim($list[$line++])] = NULL;
 } elseif ($nextdepth \> $depth) {
 if ($nextdepth-$depth \> 1) {
 die('Error on line '.(++$line+1).' in '.$filename.
 ': expected '.($depth+1).' spaces but found '.$nextdepth.'.');
 }
 $result[trim($list[$line++])] = list2array($filename, $nextdepth); 
 } elseif ($nextdepth 
Anwendung:

    <?php print_r(list2array('./test.lst'));<br />?\>


Inhalt test.lst: 


    
    node1
     node11
     node12
    node2
     node21
     node211
     node22
    node3
    node4
    node5




Ausgabe:

    Array
    (
     [node1] =\> Array
     (
     [node11] =\> 
     [node12] =\> 
     )
    
     [node2] =\> Array
     (
     [node21] =\> Array
     (
     [node211] =\> 
     )
    
     [node22] =\> 
     )
    
     [node3] =\> 
     [node4] =\> 
     [node5] =\> 
    )


Schönen Gruß,
Rudy

Hallo!

Vielen Dank! Das ist genau das, was ich brauche!!

MFG, Volker

Hallo!

Ich war jetzt beim Testen meines PHP-Scriptes und da ist mir aufgefallen, dass dein Code einen kleinen Murks macht:

Bei der Liste

node1
 node11
 node12
node2
 node21
 node211
 node212
 node213
node3
node4
 node41
 node411
 node4111
node5
 node51

stellt er „node3“ als bruder von „node21“ dar. Genauso ist es mit „node411“ und „node5“.

Anscheinend schafft er es nicht, über mehrere Ebenen „nach unten“ zu gehen.

Leider konnte ich den Fehler bis jetzt nicht finden. An sonsten ist dein Code super!

Hast du eine Idee?

MFG, Volker

Hallo!

Ich war jetzt beim Testen meines PHP-Scriptes und da ist mir
aufgefallen, dass dein Code einen kleinen Murks macht…

Wenn Du da nur nicht untertreibst… es reicht eben nicht, nur einen Anwendungsfall zu testen :confused: Der Fehler der vorigen Funktion ist, dass sie keine mehrfachen Returns macht, wenn die Tiefe des nächsten Elements kleiner als die aktuelle Tiefe-1 ist, sondern immer nur ein Return schafft (maximal eine Tiefe zurückspringen) und das Element sofort in den Array schreibt.

Diese Version hier sollte sprungfreudiger sein:

function list2array($filename, $depth=0) {
 static $line = 0;
 static $list = NULL;
 static $jumpback = false;
 $result = NULL;
 if ($list == NULL) {
 $list = file($filename) or die('Could not open list-file '.$filename);
 }
 if (!isset($list[$line])) return NULL; 
 do {
 $nextdepth = isset($list[$line+1]) ? strlen($list[$line+1])-strlen(ltrim($list[$line+1])) : 0;
 if ($nextdepth == $depth) {
 $jumpback = false;
 $result[trim($list[$line++])] = NULL;
 } elseif ($nextdepth \> $depth) {
 $jumpback = false;
 $result[trim($list[$line++])] = list2array($filename, $nextdepth); 
 } elseif ($nextdepth 

HTH - Schönen Gruß,
Rudy

Vielen Dank!!!

Jetzt scheint alles so zu funktionieren, wie es soll!

MFG, Volker