2016-12-22 15 views
1

を取得するためにMySQLを取得:は、私はこのデータベースの構造を有する階層データ構造

USERS 
----------------------------- 
| id | parent | name | points 
----------------------------- 

を私はこの構造から複数のネスト(階層)の配列を取得する必要があります。例えば

、このデータから:

[ 
    "1" => [ 
    "points" => 20, 
    "childs" => [ 
     "2" => [ 
     "points" => 10, 
     "childs" => [ 
      "5" => [ 
      "points" => 50, 
      "childs" => null 
      ] 
     ] 
     ], 
     "3" => [ 
     "points" => 30, 
     "childs" => [ 
      "4" => [ 
      "points" => 40, 
      "childs" => null 
      ] 
     ] 
     ] 
    ] 
    ] 
] 

ありがとう:以下のPHPの配列を取得する方法

USERS 
------------------------------ 
| id | parent | name | points 
------------------------------ 
| 1 | null | A | 20 
| 2 | 1  | B | 10 
| 3 | 1  | C | 30 
| 4 | 3  | D | 40 
| 5 | 2  | E | 50 
------------------------------ 

!ここで

答えて

1

は無限の深さの実施例である:

//Obtain this from database 
$datas = [ 
    [ 
     "id" => 1, 
     "parent" => null, 
     "name" => "A", 
     "points" => 20 
    ], 
    [ 
     "id" => 2, 
     "parent" => 1, 
     "name" => "B", 
     "points" => 10 
    ], 
    [ 
     "id" => 3, 
     "parent" => 1, 
     "name" => "C", 
     "points" => 30 
    ], 
    [ 
     "id" => 4, 
     "parent" => 3, 
     "name" => "D", 
     "points" => 40 
    ], 
    [ 
     "id" => 5, 
     "parent" => 2, 
     "name" => "E", 
     "points" => 50 
    ] 
]; 

$ordered = []; 

for($i=0; $i<count($datas); $i++) 
{ 
    $data = &$datas[$i]; 
    $id = $data["id"]; 
    $data["childs"] = []; 
    $ordered[$id] = &$data; 
} 

$result = []; 
for($i=0; $i<count($datas); $i++) 
{ 
    $data = &$datas[$i]; 
    $id = $data["id"]; 
    $parent = $data["parent"]; 

    //unset not needed properties 
    unset($data["id"]); 
    unset($data["parent"]);     

    if($parent){ 
     $ordered[$parent]["childs"][$id] = &$data; 
    } else { 
     $result[$id] = &$data; 
    } 
} 

結果は次のとおりです。

print_r($result); 

Array 
(
    [1] => Array 
     (
      [name] => A 
      [points] => 20 
      [childs] => Array 
       (
        [2] => Array 
         (
          [name] => B 
          [points] => 10 
          [childs] => Array 
           (
            [5] => Array 
             (
              [name] => E 
              [points] => 50 
              [childs] => Array 
               (
               )  
             )  
           )  
         )  

        [3] => Array 
         (
          [name] => C 
          [points] => 30 
          [childs] => Array 
           (
            [4] => Array 
             (
              [name] => D 
              [points] => 40 
              [childs] => Array 
               (
               )  
             )  
           )  
         )  
       )  
     )  
) 

orderedは、データの配列が含まれている(あなたが検索できidで "注文"簡単に項目のために) そしてresultはデータ階層を含んでいます。

希望します。

+0

これは2つの深さでのみ機能します。親を持つユーザ、親を持っているユーザがいる場合は、動作しません。 – mabezdek

+0

あなたの例でこれを指定していませんでした...ネストするレベルは1つだけです – Pipe

+0

申し訳ありませんが、構造は無限にすることができます(デフは50にすることができます)。 – mabezdek

関連する問題