Nested Sets-Modell
ralf
- php
0 Christian Seiler
Hi,
ich hab in einer MySQL-Datenbank eine Baumstruktur nach dem Nested Sets-Modell:
A
B
C
D
E
diese Daten möchte ich in diese Form bringen:
['A',
[
['B',
[
['C'],
['D']
]
],
['E']
]
]
Ich hab absolut keine Idee, wie ich das machen könnte.
Danke für die Hilfe,
Gruß
Ralf
Hallo ralf,
ich hab in einer MySQL-Datenbank eine Baumstruktur nach dem Nested Sets-Modell:
A
B
C
D
Ediese Daten möchte ich in diese Form bringen:
['A',
[
['B',
[
['C'],
['D']
]
],
['E']
]
]
Damit meinst Du vesrchachtelte Arrays, oder?
Ich hab absolut keine Idee, wie ich das machen könnte.
Du selektierst die Daten ja sicherlich nach dieser Methode: http://www.develnet.org/Tech/SelektierenDerDaten
Dann kannst mit dieser Funktion die Daten in ein verschachteltes Array übertragen, sofern sie wirklich in der Reihenfolge, wie sie in obiger URL angeben ist, herauskommen:
function nestedset2recarray ($list) {
$dst = array ();
for ($k = 0; $k < count ($list); $k++) {
$entry = $list[$k];
$children_array = array_splice ($list, $k+1, $entry['children']);
$entry['children_arr'] = nestedset2recarray ($children_array);
$dst[] = $entry;
}
return $dst;
}
Viele Grüße,
Christian
Hi,
['A',
[
['B',
[
['C'],
['D']
]
],
['E']
]
]Damit meinst Du vesrchachtelte Arrays, oder?
Nein, kein Array, sondern rein als String
Gruß
Ralf
Hallo ralf,
Nein, kein Array, sondern rein als String
Das hier sollte sein übriges tun:
function nestedset2string ($list, $indent = 0) {
$dst = '';
$indent_what = ' ';
$lend = "\n";
for ($k = 0; $k < count ($list); $k++) {
$entry = $list[$k];
$children_array = array_splice ($list, $k+1, $entry['children']);
$entry['children_string'] = nestedset2string ($children_array, $indent + 2);
$entry_string = str_repeat ($indent_what, $indent);
$entry_string .= '[''.$entry['payload'].''';
if ($entry['children'] > 0) {
$entry_string .= ",$lend";
$entry_string .= str_repeat ($indent_what, $indent + 1);
$entry_string .= "[$lend";
$entry_string .= $entry['children_string'];
$entry_string .= str_repeat ($indent_what, $indent + 1);
$entry_string .= "]$lend";
$entry_string .= str_repeat ($indent_what, $indent);
}
$entry_string .= ']';
if ($k < count ($list) - 1) {
$entry_string .= ',';
}
$entry_string .= $lend;
$dst .= $entry_string;
}
return $dst;
}
$indent_what ist womit eingerückt wird (standardmäßig drei Leerzeichen) und $lend ist das Zeilenende-Zeichen.
Die Daten müssen aus der Datenbank in dieser Form kommen:
$daten = array (
array ('payload' => 'A', 'children' => '12', 'level' => '1'),
array ('payload' => 'B', 'children' => '3', 'level' => '2'),
array ('payload' => 'C', 'children' => '0', 'level' => '3'),
array ('payload' => 'D', 'children' => '1', 'level' => '3'),
array ('payload' => 'E', 'children' => '0', 'level' => '4'),
[...]
);
(also so, wie sie beim SELECT in der URL, die ich gepostet habe, rauskommen)
Viele Grüße,
Christian
Hi,
funktioniert super, danke
Ralf