クラスツリー { / * * *再帰的なデータ * @paramの$データ * @param int型$ ID * @param int型の$レベル * @param配列 * @return配列 * @date 2018年10月24日午前15時40分34秒 * / パブリック 静的 関数再帰($データ、$番号 = 0、$レベル = 1 ) { $リターン = []; foreachの($データ として $ valの){ 場合($ヴァル [ 'PID'] == $番号){ $ヴァル [ 'レベル'] = $レベル。 $返す [] = $ valの; $リターン = array_merge($戻り、静的 ::再帰($データ、$ヴァル [ 'ID']、$レベル + 1 ))。 } } 返す 返さ$ ; } / * * *親の子ノード * @paramの配列$データ * @param int型$ PID * @Paramの配列$結果暫定結果 * @return配列 * @date 2018年10月24日夜三時45分44秒 * / パブリック 静的 関数ファミリ($データ、$ pidを、$結果 = []) { foreachの($データ として $ valの){ 場合($ヴァル [ 'ID'] == $のPID ){ $結果 [] = $ valの; 返す 静的 ::家族($データ、$ valの [ 'PID']、$結果); } } 戻り ます$ result ; } / * * *クエリ分類サブクラス * @paramの配列$データ * @param int型$ ID * @return配列 * @date 2018年10月24日午後四時44分18秒 * / パブリック 静的 関数 findSon($データ、$のID = 0 ) { $息子 = []; foreachの($データ として $ valの){ 場合($ヴァル [ 'PID'] == $ ID ){ $息子 [] = $ valの; } } 返す $息子を。 } / * * *ファミリーツリー * @paramの$データ * @paramの$のID * @return配列 * @date 2018年10月24日夜04時18分38秒 * / パブリック 静的 関数 familyTree($データ、$のID = 0 ) { $データ = 静的 ::再帰($データ、$のID ); 返す 静的 ::サブツリー($データ)。 } / * * *無制限のレベルのネストされたツリー * @paramの$データ * @param int型の$レベル * @param int型$ ID * @return配列 * @date 2018年10月25日午前10時59分16秒 * / パブリック 静的 関数サブツリー($データ、$レベル = 1、$番号 = 0 ) { $ RET = []; foreachの($データ として $キー => $ valの){ 場合($ヴァル [ 'レベル'] == $レベル && $ヴァル [ 'PID'] == $番号){ $データ [ $キー ] [ '子ども] = 静的 ::サブツリー($データ、$レベル +1、$ヴァル [ 'ID' ])。 もし(空($データ [ $キー ] [ '子供])){ 解除($データ [ $キー ] [ '子供]); } $ RET [] = $データ [ $キー]; } } 返す $権利を。 } }