+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Verschachteltes Array aus Nested Sets

  1. #1
    TP-Senior Schneemann macht alles soweit korrekt Avatar von Schneemann
    Registriert seit
    Jan 2006
    Beiträge
    215

    Question Verschachteltes Array aus Nested Sets

    Hallo,

    ich komme einfachnicht weiter. Ziel ist ein verschachteltes Array, das aus einer Nested Sets Anordnung gebildet wird.

    So sähe der Baum optisch aus:
    PHP-Code:
    Lebewesen
    |
    `
    -- Säugetiere
    |   |
    |   
    `-- Primaten
    |   |   |
    |   |   `
    -- Halbaffen
    |   |   |
    |   |   
    `-- Affen
    |   |
    |   `
    -- Nagetiere
    |
    `-- Menschen
        
    |
        `
    -- Asiaten
        |
        
    `-- Afrikaner 
    Die Abfrage liefert, wie nachfolgend sortiert, diese Werte:
    PHP-Code:
    id  name        level  kinder  davor  danach
    ============================================
     
    7  Lebewesen    0     8       0      0
    10  Säugetiere   1     4       1      0
     2  Primaten     2     2       1      0
     8  Halbaffen    3     0       1      0
     4  Affen        3     0       0      1
    33  Nagetiere    2     0       0      1
    52  Menschen     1     2       0      1
    22  Asiaten      2     0       1      0
    26  Afrikaner    2     0       0      1 
    "davor sagt, ob der Eintrag ein Elternelement hat, "danach" sagt ob der Eintrag Kinder hat.

    Wie kann man nun anhand dieser Werte ein verschachteltes Array bauen mit der ID als Key?
    PHP-Code:
    Array
    (
      [
    7] => Array
        (
          [
    id] => 7
          
    [name] => Lebewesen
          
    [child] => Array
            (
              [
    10] => Array
                (
                  [
    id] => 10
                  
    [name] => Säugetiere
                  
    [child] => Array
                    (
                      ...
                    )
                )
              [
    52] => Array
                (
                  [
    id] => 52
                  
    [name] => Menschen
                  
    [child] => Array
                    (
                      [
    22] => Array
                        (
                          [
    id] => 22
                          
    [name] => Asiaten
                        
    )
                      [
    26] => Array
                        (
                          [
    id] => 26
                          
    [name] => Afrikaner
                        
    )
                    )
                )
            )
        )

    Gruß,
    Peter

  2. #2
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    Hi,

    hier mal ein Ansatz. Die Abfrage nach level kann man auch noch eleganter lösen.

    PHP-Code:
    $rows = array(
        array(
    7,'Lebewesen',0,8,0,0),
        array(
    10,'Säugetiere',1,4,1,0),
        array(
    2,'Primaten',2,2,1,0),
        array(
    8,'Halbaffen',3,0,1,0),
        array(
    4,'Affen',3,0,0,1),
        array(
    33,'Nagetiere',2,0,0,1),
        array(
    52,'Menschen',1,2,0,1),
        array(
    22,'Asiaten',2,0,1,0),
        array(
    26,'Afrikaner',2,0,0,1)  
    );

    $temp=array();
    $new true;
    $level = -1;
    foreach(
    $rows as $k=>$a) {
        if (
    $a[2] == && $a[2]!=$level) {
            
    $levelId = array(); // reset array
        
    }
        
    $id $a[0];
        
    $level $a[2];
        
    $levelId[$level]=$a[0];
        echo 
    'Level '.$a[2].' ID '.$id.'</br>';
        
        
    $array =  array(
                
    'id' => $id,
        );
        
        if (
    $level == 0) {
            
    $temp[$id] = $array;
        } elseif (
    $level == 1) {
            
    $temp[$levelId[0]]['child'][$id] = $array;    
        } elseif (
    $level == 2) {
            
    $temp[$levelId[0]]['child'][$id][$levelId[1]]['child'] = $array;    
        } elseif (
    $level == 3) {
            
    $temp[$levelId[0]]['child'][$id][$levelId[1]]['child'][$levelId[2]]['child'] = $array;    
        }
        
    }
    echo 
    '<h1>Rows</h1>';
    echo 
    '<pre>'.print_r($rows,true).'</pre>';
    echo 
    '<h1>Array</h1>';
    echo 
    '<pre>'.print_r($temp,true).'</pre>'


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  3. #3
    TP-Senior Schneemann macht alles soweit korrekt Avatar von Schneemann
    Registriert seit
    Jan 2006
    Beiträge
    215
    Problem dabei ist aber, dass das nur in Ebene 1 funktioniert.
    Gruß,
    Peter

  4. #4
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    wieso? Hast Du Dir die Ausgabe des Scriptes angeschaut?


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


  5. #5
    TP-Senior Schneemann macht alles soweit korrekt Avatar von Schneemann
    Registriert seit
    Jan 2006
    Beiträge
    215
    Ja, ich habe deinen Code ausgeführt und das Ergebnis ist nicht korrekt.

    PHP-Code:
    Array
    (
      [
    7] => Array
        (
          [
    id] => 7
          
    [child] => Array
            (
              [
    10] => Array
                (
                  [
    id] => 10
                
    )

              [
    2] => Array
                (
                  [
    10] => Array
                    (
                      [
    child] => Array
                        (
                          [
    id] => 2
                        
    )
                    )
                )

              [
    8] => Array
                (
                  [
    10] => Array
                    (
                      [
    child] => Array
                        (
                          [
    2] => Array
                            (
                              [
    child] => Array
                                (
                                  [
    id] => 8
                                
    )
                            )
                        )
                    )
                )

              [
    4] => Array
                (
                  [
    10] => Array
                    (
                      [
    child] => Array
                        (
                          [
    2] => Array
                            (
                              [
    child] => Array
                                (
                                  [
    id] => 4
                                
    )
                            )
                        )
                    )
                )

              [
    33] => Array
                (
                  [
    10] => Array
                    (
                      [
    child] => Array
                        (
                          [
    id] => 33
                        
    )
                    )
                )

              [
    52] => Array
                (
                  [
    id] => 52
                
    )

              [
    22] => Array
                (
                  [
    52] => Array
                    (
                      [
    child] => Array
                        (
                          [
    id] => 22
                        
    )
                    )
                )

              [
    26] => Array
                (
                  [
    52] => Array
                    (
                      [
    child] => Array
                        (
                          [
    id] => 26
                        
    )
                    )
                )
            )
        )

    Die Kinder sind öfters vorhanden als sie sein dürften und teilweise auch doppelt. Alles hängt unter der ID 7, auch die Kinder von anderen Bäumen.
    Gruß,
    Peter

  6. #6
    TP-Special Mod steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User steffenk lebt für das TP und seine User Avatar von steffenk
    Registriert seit
    Feb 2005
    Ort
    Haan / NRW
    Beiträge
    12.869
    vergleich mal mit Deinem Array

    ja gut, war ein kleiner Fehler drin, aber war ja nur ein Ansatz
    PHP-Code:
    $rows = array(
        array(
    7,'Lebewesen',0,8,0,0),
        array(
    10,'Säugetiere',1,4,1,0),
        array(
    2,'Primaten',2,2,1,0),
        array(
    8,'Halbaffen',3,0,1,0),
        array(
    4,'Affen',3,0,0,1),
        array(
    33,'Nagetiere',2,0,0,1),
        array(
    52,'Menschen',1,2,0,1),
        array(
    22,'Asiaten',2,0,1,0),
        array(
    26,'Afrikaner',2,0,0,1)  
    );

    $temp=array();
    $new true;
    $level = -1;
    foreach(
    $rows as $k=>$a) {
        if (
    $a[2] == && $a[2]!=$level) {
            
    $levelId = array(); // reset array
        
    }
        
    $id $a[0];
        
    $level $a[2];
        
    $levelId[$level]=$a[0];
        echo 
    'Level '.$a[2].' ID '.$id.'</br>';
        
        
    $array =  array(
                
    'id' => $id,
                
    'name' => $a[1]
        );
        
        if (
    $level == 0) {
            
    $temp[$id] = $array;
        } elseif (
    $level == 1) {
            
    $temp[$levelId[0]]['child'][$id] = $array;    
        } elseif (
    $level == 2) {
            
    $temp[$levelId[0]]['child'][$levelId[1]]['child'][$id] = $array;    
        } elseif (
    $level == 3) {
            
    $temp[$levelId[0]]['child'][$levelId[1]]['child'][$levelId[2]]['child'][$id] = $array;    
        }
        
    }
    echo 
    '<h1>Rows</h1>';
    echo 
    '<pre>'.print_r($rows,true).'</pre>';
    echo 
    '<h1>Array</h1>';
    echo 
    '<pre>'.print_r($temp,true).'</pre>'


    TYPO3 · MySQLDumper · dislabs
    ·
    manche Mühlen mahlen schneller ...
    "Ich habe Rücken"
    Horst Schlämmer


+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51