2015-10-29 3 views
1

У меня есть база данных с бесконечным количеством вопросов и вопросов для детей. Поэтому вы можете спросить что-то вроде: «какое платежное решение вы принимаете». Тогда ответы ребенка могут быть: «Обработка CC» и «проверка». Тогда у «CC Processing» могут быть дети: «Принимаете ли вы визу и мастер-карту». и т.д.Рекурсивная функция, не возвращающая всех детей

enter image description here

===

У меня есть функция PHP и рекурсивную функцию, установленную в Laravel 5.1, чтобы захватить информацию мне нужно и создать "дерево" массив:

public function create($id) 
{ 
    //BUILD THE TREE 
    $tree = array(); 
    //GET TOP LEVEL ITEMS 
    $top_level = Questions::where('parentId', 0)->where('industryId', $id)->get()->toArray(); 

    foreach($top_level as $top){ 

     $branch = array(); 
     $branch['id'] = $top['id']; 
     $branch['industryId'] = $top['industryId']; 
     $branch['question'] = $top['question']; 
     $branch['parentId'] = $top['parentId']; 
     $branch['endPoint'] = $top['endPoint']; 
     $branch['order'] = $top['order']; 

     $children = Questions::where('parentId', $top['id'])->get()->toArray(); 

     //CHECK FOR CHILDREN 
     if(count($children > 0)) { 

      //THERE ARE CHILDREN PASS THEM TO A RECURSIVE FUNCTION TO GET LIST 
      $branch['children'] = $this->getChildren($children); 

     }else { 
      //THERE ARE NO CHILDREN SET TO EMPTY ARRAY 
      $branch['children'] = array(); 
     } 

     $tree[] = $branch; 

    } 

    //Send the question tree to the view... 
    $data['questions'] = $tree; 

    //Grab the industry 
    $data['industry'] = Industries::where('id', $id)->get(); 

    return $data['questions']; 
    //return view('questions.create', $data); 
} 

public function getChildren($children) { 

    foreach($children as $child){ 
     $child_branch = array(); 
     $child_branch['id'] = $child['id']; 
     $child_branch['industryId'] = $child['industryId']; 
     $child_branch['question'] = $child['question']; 
     $child_branch['parentId'] = $child['parentId']; 
     $child_branch['endPoint'] = $child['endPoint']; 
     $child_branch['order'] = $child['order']; 

     $children = Questions::where('parentId', $child['id'])->get()->toArray(); 
     //CHECK FOR CHILDREN 
     if(count($children > 0)) { 
      //THERE ARE CHILDREN PASS THEM TO THIS FUNCTION (RECURSION) TO GET LIST 
      $child_branch['children'] = $this->getChildren($children); 
     }else { 
      //THERE ARE NO CHILDREN SET TO EMPTY ARRAY 
      $child_branch['children'] = array(); 
     } 

     return $child_branch; 
    } 
} 

мое "дерево" массив возвращает следующее:

[ 
{ 
"id": 18, 
"question": "How Do you Accept Payments?", 
"parentId": 0, 
"endPoint": 0, 
"order": 0, 
"children": { 
"id": 19, 
"industryId": 1, 
"question": "Card Station", 
"parentId": 18, 
"endPoint": 0, 
"order": 0, 
"children": { 
"id": 25, 
"industryId": 1, 
"question": "What type of card station?", 
"parentId": 19, 
"endPoint": 0, 
"order": 0, 
"children": null 
} 
} 
}, 
{ 
"id": 21, 
"question": "What?", 
"parentId": 0, 
"endPoint": 0, 
"order": 0, 
"children": { 
"id": 22, 
"industryId": 1, 
"question": "Testing This", 
"parentId": 21, 
"endPoint": 0, 
"order": 0, 
"children": null 
} 
} 
] 

Не хватает некоторых детей. Я чувствую, что я ПОЧТИ, но я просто не могу собрать финальные фрагменты.

Основываясь на моей снимке базы данных выше, я должен получить родителя «Как вы принимаете платежи с идентификатором 18». Тогда массив моих детей должен НАСТОЯТЕЛЬНО быть: «карточная станция», «вручную» и «тест». Тогда «карточная станция» должна иметь детей, «какой тип карточной станции».

Любые идеи о недостающем звене здесь оцениваются.

+0

Является ли это опечатка? '$ brand ['industryId'] = $ top ['industryId'];' где у вас есть '$ brand', а не' $ branch'? –

+0

Вы запрашиваете свою базу данных в рекурсивном цикле? Кажется, это очень плохая идея для меня. Вы считали, что вместо этого используете модель вложенного набора? –

+0

Это мой первый проект на Laravel. Не уверен, что это вообще вещь PHP или что. Любые примеры, о которых вы можете думать? Я программировал много лет и считаю, что это или нет, это первый раз, когда я пытался сделать такую ​​рекурсию. лол. –

ответ

2

Здесь вы идете - в вашем методе getChildren, вы возвращали первый «child_branch» в цикле, который по существу пропустил.

В моем первом редактировании вы можете увидеть массив $branch и вернуть его. В последующих изменениях я фактически беру входной массив, изменяя его в цикле и возвращаю его в конце. Я смог ограничить входной массив желаемым форматом с помощью вызова метода select в вашем запросе.

Я взял на себя смелость DRY-ING ваш код немного, делая «ствол» просто еще одна ветвь (Повторное использование GetChildren):

public function getQuestions($parentId, $industryId=null) 
{ 
    $query = Questions::where('parentId', $parentId); 
    if ($industry) { 
     $query->where('industryId', $id); 
    } 
    return $query->select('id', 'industryId', 'question', 'parentId', 'endPoint', 'order')->get()->toArray(); 
} 

public function create($id) 
{ 
    //BUILD THE TREE 
    $tree = array(); 
    //GET TOP LEVEL ITEMS 
    $trunk = $this->getQuestions(0, $id); 
    $tree = $this->getBranch($trunk); 

    //Send the question tree to the view... 
    $data['questions'] = $tree; 

    //Grab the industry 
    $data['industry'] = Industries::where('id', $id)->get(); 

    return $data['questions']; 
    //return view('questions.create', $data); 
} 

public function getBranch($twigs) { 
    foreach ($twigs as $twig) { 
     // Check for children 
     $children = $this->getQuestions($twig['id']); 
     $twig['children'] = count($children) ? $this->getBranch($children) : array(); 
    } 
    return $twigs; 
} 
+0

вы забыли вернуть '$ branch' – ElefantPhace

+0

Derp. Готово. :) Благодаря! –

+0

Абсолютно красивый. Именно то, что мне нужно. Я ценю это! Любой, кто использует Laravel, который находит это в будущем, когда он вызывает функцию getChildren в методе create, вы должны использовать $ this-> getChildren ($ trunk); ЕЩЕ РАЗ СПАСИБО! –

Смежные вопросы