ralf: Nested Sets-Modell

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

  1. Hallo ralf,

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

    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

    1. Hi,

      ['A',
         [
            ['B',
               [
                   ['C'],
                   ['D']
               ]
            ],
            ['E']
         ]
      ]

      Damit meinst Du vesrchachtelte Arrays, oder?

      Nein, kein Array, sondern rein als String

      Gruß

      Ralf

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

    2. Hi,

      funktioniert super, danke

      Ralf