2016-06-29 6 views
1

Ich habe eine flache Struktur, die ich in eine verschachtelte baumartige Struktur konvertieren muss. Dies unterscheidet sich von other Stack Overflow questions, weil die Kinder wiederholen können (d. H. Die gleiche Frage-ID und Eltern-ID haben können). Ich habe versucht, dies mit verzweigter Rekursion ohne Glück zu lösen.PHP Branching Rekursion mit wiederholten Kindern

Input (flache Array):

[ 
    [ 
     'questionId' => 1, 
     'name' => 'albumName', 
     'parentId' => 0, 
     'answer' => "Name of album", 
    ], 
    [ 
     'questionId' => 2, 
     'name' => 'albumGenre', 
     'parentId' => 0, 
     'answer' => "album genre", 
    ], 
    [ 
     'questionId' => 3, 
     'name' => 'trackStart', 
     'parentId' => 0, 
    ], 
    [ 
     'questionId' => 4, 
     'name' => 'trackName', 
     'parentId' => 3, 
     'answer' => "Track One", 
    ], 
    [ 
     'questionId' => 5, 
     'name' => 'trackEnd', 
     'parentId' => 3, 
    ], 
    [ 
     'questionId' => 3, 
     'name' => 'trackStart', 
     'parentId' => 0, 
    ], 
    [ 
     'questionId' => 4, 
     'name' => 'trackName', 
     'parentId' => 3, 
     'answer' => "Track Two", 
    ], 
    [ 
     'questionId' => 6, 
     'name' => 'artistStart', 
     'parentId' => 3, 
    ], 
    [ 
     'questionId' => 7, 
     'name' => 'artistName', 
     'parentId' => 6, 
     'answer' => "Artist Name", 
    ], 
    [ 
     'questionId' => 8, 
     'name' => 'artistEnd', 
     'parentId' => 6, 
    ], 
    [ 
     'questionId' => 5, 
     'name' => 'trackEnd', 
     'parentId' => 3, 
    ], 
    [ 
     'questionId' => 9, 
     'name' => 'albumDate', 
     'parentId' => 0, 
     'answer' => "album Date", 
    ]  
] 

gewünschte Ausgabe (verschachtelte Array):

[ 
    'albumName' => 'Album Name', 
    'albumGenre' => 'Album Genre', 
    'trackStart' => [ 
     [ 
      'trackName' => 'Track One' 
     ], 
     [ 
      'trackName' => 'Track Two', 
      'artistStart' => [ 
       [ 
        'artistName' => 'Artist Name' 
       ] 
      ] 
     ] 
    ], 
    'albumDate' => 'album Date' 
] 

Antwort

1

Sie können diese mit Referenz Pointers lösen:

$newArray = array(); 
$pointer[] = &$newArray; 

foreach($arr as $ar) { 

    if(stristr($ar['name'], "start")) { // Start 

     $pointer[] = &$pointer[count($pointer)-1][$ar['name']][]; 

    } else if(stristr($ar['name'], "end")) { // End 

     array_pop($pointer); 

    } else { 

     $pointer[count($pointer)-1][$ar['name']] = $ar['answer']; 

    } 
} 

Um es schneller Sie können stripos ($ ar ['name'], "start") verwenden! == false;