2017-09-15 64 views
1

我已經寫了一個循環,它首先檢查子類別表中是否存在基於數據庫中名爲'category_id'的字段的任何子類別。如何使這個循環成爲遞歸循環?

我想在這裏做的是遞歸地檢查子類別以查看是否有任何子類別的'parent_id'設置爲相應的ID。檢查需要做的是添加到數組(請參閱下面的代碼片段以獲得更好的解釋)。

首先來說明的示例結構:

Main Category 
- Sub category level 1 (identified by 'category_id' matching 'id' of Main Category) 
- - Sub category level 2 (identified by 'parent_id' matching 'id' of Sub category level 1 
- - - Sub category level 3 (identified by 'parent_id' matching 'id' of Sub category level 2 

這旨在無限期地繼續下去。這裏是一個非遞歸函數正確執行任務的例子:我不知道如何使這個遞歸儘管看到重複的部分

$final = []; 

    foreach($values as $k => $v) { 
     $check = collect(Subcategory::where('category_id', $v['id'])->get()); 
     $v['subcategory'] = 0; 
     $final[] = $v; 
     if (count($check) > 0) { 
      foreach($check as $c) { 
       $val = $c->toArray(); 
       $val['name'] = '- '.$val['name']; 
       $val['subcategory'] = 1; 
       $final[] = $val; 
       /* recursive here onward */ 
       $check2 = collect(Subcategory::where('parent_id', $c['id'])->get()); 
       if (count($check2) > 0) { 
        foreach($check2 as $c) { 
         $val = $c->toArray(); 
         $val['name'] = '- - '.$val['name']; 
         $final[] = $val; 
         $check3 = collect(Subcategory::where('parent_id', $c['id'])->get()); 
         if (count($check3) > 0) { 
          foreach($check3 as $c) { 
           $val = $c->toArray(); 
           $val['name'] = '- - - '.$val['name']; 
           $final[] = $val; 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

。任何人都可以提出一個遞歸函數,它會一直執行代碼片段中「遞歸此處」之下的內容,直到檢查返回0?

+1

簡短說明:包裹在函數中使用'foreach(){}'並在$ if中使用$ check作爲參數調用if(count($ check)> 0){}'。 – Jeff

回答

1

通常你從一個遞歸函數需要的是使用上一步驟中獲取的數據,使新的計算,你也可能需要遞歸級別你英寸

在你的情況,你需要將數據提供你的功能是類別id和遞歸級別。

所以我建議你嘗試類似下面的代碼:

function getSubCategories($id, $level) { 
    $check = collect(Subcategory::where('category_id', $id)->get()); 
    $subCategories = array(); 
    foreach ($check as $c) { 
     $val = $c->toArray(); 
     $subCategories[] = array(
      'id' => $val['id'], 
      'name' => str_repeat('- ', $level) .$val['name'], 
      'level' => $level, 
      'subIds' => getSubCategories($val['id'], ++$level) 
     ); 
    } 
    return $subCategories; 
} 
// Call the function. 
$categories = array(
    'id' => 1, 
    'name' => 'name', 
    'level' => 0, 
    'subIds' => getSubCategories(1, 1) 
); 

最後,你可以使用另一個遞歸函數來打印你的數據,像這樣的:

function printR($category) { 
    print $category['name'] . $category['level'] . "\n"; 
    foreach ($category['subIds'] as $sub) { 
     printR($sub); 
    } 
} 
printR($categories); 
+0

非常好 - 這正是我正在尋找的正確方向。修改它有點適合我工作和完美的作品。謝謝 –