2016-05-27 5 views
1

私はlaravelにファミリーツリーアプリケーションを持っています。私はアウトラインビューを表示したいです(以前から家族から始め、その子供たちを見せて、それらの家族の子供など)。再帰的php関数:バグを発見することの問題

だから私は、この再帰get_descendants機能を作った:

public static function get_descendants(Family $family, $results_array, $counter) 
     { 
      // start new round with a different temp array, to keep track 
      $counter++; 
      $this_array = "array_$counter"; 
      $$this_array = []; 

      array_push ($$this_array, $family->caption); 

      $kids = FamilyController::get_kids_of_family($family); 

      // if family has no kids, return 0; 
      if (!count($kids)) 
      { 
       return 0; 
      } 

      else // add kids and check for their families 
      { 
       foreach ($kids as $kid) { 
        array_push ($$this_array, $kid->firstname); 

        // get families made by kid- for each one, call get_descendants 
        $families_made = FamilyController::get_families_person_made($kid); 

        foreach ($families_made as $new_family) { 
         array_push($$this_array, self::get_descendants($new_family, $$this_array, $counter)); 
        } 
       }; 

       // we've gone through the kids, add this round's array to the general results array 
       array_push ($results_array, $$this_array); 
      } 
      return $results_array; 
     } 

私はをループが正しいことをprint文で確認しましたが、私は結果を保存しています方法に問題があります。

array:1 [▼ 
    0 => array:4 [▼ 
    0 => "Padme & Anakin" 
    1 => "Leia" 
    2 => array:3 [▼ 
     0 => "Leia & Han" 
     1 => "Kylo Ren" 
    ] 
    3 => "Luke" 
    ] 
] 

が、私は(途中で余分な繰り返しで)これを取得しています:私は、ネストされた子どもたちとその家族で、トップの家族は一度示し、このような何かを、取得したい

array:1 [▼ 
    0 => array:4 [▼ 
    0 => "Padme & Anakin" 
    1 => "Leia" 
    2 => array:3 [▼ 
     0 => "Padme & Anakin" 
     1 => "Leia" 
     2 => array:3 [▼ 
     0 => "Leia & Han" 
     1 => "Kylo Ren" 
     ] 
    ] 
    3 => "Luke" 
    ] 
] 

私のミスはどこに見えるのですか?

+0

ありがとうございます。ライアン - はい、それをテストする方法を与える上で良いアイデア!すべてのものは今データベースに入っています... PHPソース配列を作ることについてあなたが何を意味するのかよく分かりませんが、チュートリアルのページが分かれば喜んでできます。 –

+1

Annnnd私はちょうどこの問題を発見しました。$$ this_arrayを返して、一般的な$ results_arrayを除外すればすべてが素晴らしいです。私は今、「バグを見つけてください」というポストは、人々が混乱や時間を無駄に掘り下げるための簡単な方法なしに恐ろしいアイデアであることを知っています –

+0

喜んでそれを修正しました:) –

答えて

0

ダイナミックアレイで不必要に複雑に見えますが、同じアレイにデータを格納し続けるので、Lukeが間違った場所に表示されます。

動的な配列名を使用するのではなく、配列内の人がどこにいるのかがきれいな解決策になる可能性があります。ちょうど提案 -

public static function getDescendants(Family $family) 
{ 
    $family = []; 
    $family['name'] = $family->caption; 
    if ($kids = static::getKidsOfFamily($family)) { 
     foreach ($kids as $kid) { 
      $family['children'][] = $kid->firstname; 
      $subfamilies = static::getFamiliesPersonMade($kid); 
      foreach ($subfamilies as $subfamily) { 
       $family['subfamilies'][] = static::getDescendants($subfamily); 
      } 
     }; 
    } 

    return $family; 
} 

array [ 
    "name" => "Padme & Anakin" 
    "children" => array [ 
     "Leia", 
     "Luke" 
    ], 
    "subfamilies" => array [ 
     array [ 
      "name" => "Leia & Han" 
      "children" => array [ 
       "Kylo Re" 
      ] 
     ] 
    ] 
] 
+0

ありがとう、@gingerCodeNinja!私はそれが働く方法について考えています....私の脳が爆発する部分は、私の家族の木が7世代後になるということなので、深く深く進んでいくためには「サブファミリー」の中に道が必要です。 「サブファミリー」内でそれらをどのように結びつけることができるかについてはっきりしていません....もっと言えますか? PS-私は上記のコードで1つの単純化を行いました。私の結果は1つの配列になります。 –

1

アップデートのようなものを生成します:それはこのように、私はその最終results_arrayを取り除くだけダイナミック1に全体の方法を使用して取得する場合、それが動作することが判明し:

public static function get_descendants(Family $family, $results_array, $counter) 
    { 
     // start new round with a different temp array, to keep track 
     $counter++; 
     $this_array = "array_$counter"; 
     $$this_array = []; 

     array_push ($$this_array, $family->caption); 

     $kids = FamilyController::get_kids_of_family($family); 

     // if family has no kids, return 0; 
     if (!count($kids)) 
     { 
      return 0; 
     } 

     else // add kids and check for their families 
     { 
      foreach ($kids as $kid) { 
       array_push ($$this_array, $kid->first); 

       // get families made by kid- for each one, call get_descendants 
       $families_made = FamilyController::get_families_person_made($kid); 

       if (count($families_made)) 
       { 
        foreach ($families_made as $new_family) { 

         array_push($$this_array, self::get_descendants($new_family, $$this_array, $counter)); 
        } 
       } 

      }; 

     } 
     return $$this_array; 
    } 
関連する問題