2016-06-29 10 views
1

私はネストされたツリーのような構造に変換する必要があるフラットな構造を持っています。これは子供が反復することができる(すなわち、同じquestionIdとparentIdを持つことができる)ため、other Stack Overflow questionsとは異なります。私は幸運のない分岐再帰でこれを解決しようとしました。反復子を使用したPHP分岐の再帰

入力(フラット配列):

[ 
    [ 
     '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", 
    ]  
] 

所望の出力(ネストされた配列):それはより速く行うために

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

    } 
} 

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

答えて

1

あなたは、この使用して参照ポインタを解決することができますあなたはstripos($ ar ['name']、 "start")を使うことができます!== false;

関連する問題