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
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