2010-03-01 88 views
5

我有一組陣列的作品出來的可能組合下面的PHP代碼:如何存儲這個遞歸函數的結果?

function showCombinations($string, $traits, $i){ 

    if($i >= count($traits)){ 

     echo trim($string) . '<br>'; 

    }else{ 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 

} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

showCombinations('', $traits, 0); 

不過,我的問題是,我需要的結果存儲在處理數組後,而不是僅僅把它們打印但我不明白如何在不使用全局變量的情況下做到這一點。

有誰知道一種替代方式來實現類似的東西或修改這個給我的結果,我可以使用?

回答

11

返回它們。使showCombinations()返回項目列表。在第一種情況下,你只返回一個項目,在另一個遞歸的情況下,你返回一個包含所有合併的返回列表的列表。例如:

function showCombinations(...) { 
    $result = array(); 
    if (...) { 
     $result[] = $item; 
    } 
    else { 
     foreach (...) { 
      $result = array_merge($result, showCombinations(...)); 
     } 
    } 
    return $result; 
} 
+0

感謝你們,昨天我有點心理障礙 - 真的很快! – Tom 2010-03-02 11:56:34

+0

非常感謝。我通過引用傳遞了一個結果數組,但是這感覺更清晰。 – 2012-12-08 13:01:47

+0

非常感謝救生員! – Liko 2015-02-02 03:14:21

0

將結果存儲在$ _SESSION變量中。

0

使用可變範圍修改器static可以工作。或者,您可以使用引用,但這只是另一個要傳遞的變量。這適用於「返回語法」。

function showCombinations($string, $traits, $i){ 
    static $finalTraits; 
    if (!is_array($finalTraits)) { 
     $finalTraits = array(); 
    } 
    if($i >= count($traits)){ 

     //echo trim($string) . '<br>'; 
     $finalTraits[] = $string; 

    } else { 

     foreach($traits[$i] as $trait){ 
      showCombinations("$string$trait", $traits, $i + 1); 
     } 

    } 
    return $finalTraits; 
} 

$traits = array(
      array('1','2'), 
      array('1','2','3'), 
      array('1','2','3') 
      ); 

echo join("<br>\n",showCombinations('', $traits, 0)); 

當然,在變量的靜態屬性追上你之前,這將按預期工作一次。因此,這可能是一個更好的解決方案:

function showCombinations($string, $traits, $i){ 
    $finalTraits = array(); 
    if($i >= count($traits)){ 
     $finalTraits[] = $string; 
    } else { 
     foreach($traits[$i] as $trait){ 
      $finalTraits = array_merge(
           $finalTraits, 
           showCombinations("$string$trait", $traits, $i + 1) 
           ); 
     } 
    } 
    return $finalTraits; 
} 
+0

如果您多次調用該函數,調試會很有趣。 – 2010-03-01 19:01:04

+0

點已經解決。 – Dereleased 2010-03-01 19:08:31

1

除了其他的答案,你可以通過周圍的數組的地址的功能裏面,但老實說,這是幾乎沒有做到這一點的最好辦法。

0

雖然Lukáš的解決方案是最純粹的解決方案,但它沒有副作用,因此它可能對大型輸入無效,因爲它會迫使引擎不斷產生新的陣列。有兩種以上的方式,似乎是較少的內存消耗

  • 具有結果陣列通過引用傳遞和替換$回波呼叫導致[] =
  • (優選的)包住整個故事成類並使用$這個 - >導致在適當的時候

用PHP迭代器

0
public function pageslug_genrator($slug,$cat){ 


    $page_check=$this->ci->cms_model->show_page($slug); 

     if($page_check[0]->page_parents != 0){ 

     $page_checks=$this->ci->page_model->page_list($page_check[0]->page_parents); 
     $cat[]=$page_checks['re_page'][0]->page_slug; 
     $this->pageslug_genrator($page_checks['re_page'][0]->page_slug,$cat);  

     } 
    else 
     { 
     return $cat; 

     } 
    } 

此功能犯規返回任何值一起使用時的類方法是特別好但是當我在做print_r $ cat的時候,