2017-02-21 41 views
1

我試圖在鏈條的數據來顯示所有的父母特定的孩子像下面的圖片顯示父母使用PHP MySQL的

first image here

此表數據的特定子ID

second image here

到目前爲止,我已經嘗試用下面的方法:

// for this one i am getting a indefinite loop 

public function buildBinaryTree($user_id) 
{ 
    $pictures = []; 

    $p_info = $this->memberRepository->getMemberInfo($user_id); 
    $p_id = $p_info->member_id; 

    if(empty($p_id)){ 
     return; 
    } 

    $children = $this->buildBinaryTree($p_id); 

    if ($children) { 
     echo "child ". $p_id."</br>"; 
    } 
} 

public function buildTree($all_members, $user_id) 
{ 
    $pictures = []; 

    foreach ($all_members as $item) { 

     if ($item->member_id == $user_id) { 

      $pictures[] = [ 
       'member_id'  => $item->member_id, 
       'referrar_id'  => $item->user_id 
      ]; 

      $children = $this->buildTree($all_members, $item->user_id); 

      if ($children) { 
       $item['children'] = $children; 
      }    
     } 
    } 

    return $pictures; 

} 

但我仍然不能圖如何獲得數據爲:

8-> 7-> 6-> 5-> 4-> 3-> 2-> 1-> 0

a[0]{ 
    'member_id' => 8, 
    'user_id' => 7 
}, 
a[1]{ 
    'member_id' => 7, 
    'user_id' => 6 
}, 

我正在尋找最好的方法來找到所有的頂級父母對於使用PHP MySQL的數據鏈中的特定子ID?

回答

1

分層數據可能會很棘手,特別是如果您不能保證它的深度不超過2層或類似情況。

這以前的答案可能是幫助:https://stackoverflow.com/a/990536/7595840

你會發現這一些嵌套從上面的鏈接設置,但我有一些運氣重組我的數據模型與使用Modified Preorder Tree Traversal Algorithm更復雜的層次結構。它確實需要稍微重構你的數據,但它對於像你這樣的情況在構建層次樹的完整表示方面非常有用,並且性能非常高。

0

您可能希望通過執行遞歸函數來最小化傳遞函數的數量,這可能會讓您自己爲之後的嚴重性能問題而自行設置。通過一次傳遞並使用引用,您可以使其運行速度非常快並且工作得非常好。內存使用率也會比原始數據集略高,因爲一切都是通過引用完成的,而不是通過複製完成的。如果更新其中一條記錄,則所有記錄都會隨之更新。

輸入數組

$rows = [ 
    [ 'id' => 1, 'parent' => null ], 
    [ 'id' => 2, 'parent' => 1 ], 
    [ 'id' => 3, 'parent' => 1 ], 
    [ 'id' => 4, 'parent' => 2 ], 
    [ 'id' => 5, 'parent' => 3 ], 
    [ 'id' => 6, 'parent' => 4 ], 
    [ 'id' => 7, 'parent' => 5 ], 
    [ 'id' => 8, 'parent' => 6 ], 
    [ 'id' => 9, 'parent' => 7 ], 
    [ 'id' => 10, 'parent' => 8 ], 
]; 

變量在這裏您可以存儲您的參考

$tree = []; 

循環記錄集

foreach($rows as $row) { 

檢查這裏看到,如果你已經添加了此行,從理論上講,除非你有重複的條目

if (
     false === array_key_exists($row['id'], $tree) || 
     false === array_key_exists('data', $tree[$row['id']]) 

    ) { 
     $tree[$row['id']]['data'] = $row; 
    } 

檢查,看看你這個應該總是回來真有父母,然後如果父母已添加和/或如果孩子已初始化

if (
     $row['parent'] && 
     (
      false === array_key_exists($row['parent'], $tree) || 
      false === array_key_exists('children', $tree[$row['parent']]) 
     ) 
    ) { 
     $tree[$row['parent']]['children'] = []; 
    } 

增加孩子的引用到父,格外小心,注意&它說,這是通過參考

if ($row['parent']) { 
     $tree[$row['parent']]['children'][] = &$tree[$row['id']]; 
    } 
} 

$樹成爲下

[ 
    1 => 
    [ 
    'data' => 
    [ 
     'id' => 1, 
     'parent' => NULL, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 2, 
      'parent' => 1, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 4, 
       'parent' => 2, 
      ], 
      'children' => 
      [ 
       0 => 
       [ 
       'data' => 
       [ 
        'id' => 6, 
        'parent' => 4, 
       ], 
       'children' => 
       [ 
        0 => 
        [ 
        'data' => 
        [ 
         'id' => 8, 
         'parent' => 6, 
        ], 
        'children' => 
        [ 
         0 => 
         [ 
         'data' => 
         [ 
          'id' => 10, 
          'parent' => 8, 
         ], 
         ], 
        ], 
        ], 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
     1 => 
     [ 
     'data' => 
     [ 
      'id' => 3, 
      'parent' => 1, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 5, 
       'parent' => 3, 
      ], 
      'children' => 
      [ 
       0 => 
       [ 
       'data' => 
       [ 
        'id' => 7, 
        'parent' => 5, 
       ], 
       'children' => 
       [ 
        0 => 
        [ 
        'data' => 
        [ 
         'id' => 9, 
         'parent' => 7, 
        ], 
        ], 
       ], 
       ], 
      ], 
      ], 
     ], 
     'name' => 'test', 
     ], 
    ], 
    ], 
    2 => 
    [ 
    'data' => 
    [ 
     'id' => 2, 
     'parent' => 1, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 4, 
      'parent' => 2, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 6, 
       'parent' => 4, 
      ], 
      'children' => 
      [ 
       0 => 
       [ 
       'data' => 
       [ 
        'id' => 8, 
        'parent' => 6, 
       ], 
       'children' => 
       [ 
        0 => 
        [ 
        'data' => 
        [ 
         'id' => 10, 
         'parent' => 8, 
        ], 
        ], 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
    ], 
    ], 
    3 => 
    [ 
    'data' => 
    [ 
     'id' => 3, 
     'parent' => 1, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 5, 
      'parent' => 3, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 7, 
       'parent' => 5, 
      ], 
      'children' => 
      [ 
       0 => 
       [ 
       'data' => 
       [ 
        'id' => 9, 
        'parent' => 7, 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
    ], 
    'name' => 'test', 
    ], 
    4 => 
    [ 
    'data' => 
    [ 
     'id' => 4, 
     'parent' => 2, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 6, 
      'parent' => 4, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 8, 
       'parent' => 6, 
      ], 
      'children' => 
      [ 
       0 => 
       [ 
       'data' => 
       [ 
        'id' => 10, 
        'parent' => 8, 
       ], 
       ], 
      ], 
      ], 
     ], 
     ], 
    ], 
    ], 
    5 => 
    [ 
    'data' => 
    [ 
     'id' => 5, 
     'parent' => 3, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 7, 
      'parent' => 5, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 9, 
       'parent' => 7, 
      ], 
      ], 
     ], 
     ], 
    ], 
    ], 
    6 => 
    [ 
    'data' => 
    [ 
     'id' => 6, 
     'parent' => 4, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 8, 
      'parent' => 6, 
     ], 
     'children' => 
     [ 
      0 => 
      [ 
      'data' => 
      [ 
       'id' => 10, 
       'parent' => 8, 
      ], 
      ], 
     ], 
     ], 
    ], 
    ], 
    7 => 
    [ 
    'data' => 
    [ 
     'id' => 7, 
     'parent' => 5, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 9, 
      'parent' => 7, 
     ], 
     ], 
    ], 
    ], 
    8 => 
    [ 
    'data' => 
    [ 
     'id' => 8, 
     'parent' => 6, 
    ], 
    'children' => 
    [ 
     0 => 
     [ 
     'data' => 
     [ 
      'id' => 10, 
      'parent' => 8, 
     ], 
     ], 
    ], 
    ], 
    9 => 
    [ 
    'data' => 
    [ 
     'id' => 9, 
     'parent' => 7, 
    ], 
    ], 
    10 => 
    [ 
    'data' => 
    [ 
     'id' => 10, 
     'parent' => 8, 
    ], 
    ], 
] 
+0

感謝您的詳細解答。如果您將大量數據作爲輸入數組「$ rows」執行,會發生什麼情況。我需要獲取上述屏幕截圖中提到的特定小孩的所有頂級數據。我想獲取每個特定ID的父ID,並保持它直到父母爲NULL。你認爲你可以爲我的特定需求提供可行的樣本嗎?我將非常感謝您的幫助和支持 –