Christian Seiler: Nested Sets-Modell

Beitrag lesen

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