2010-03-01 2 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

+0

Спасибо. Я передавал массив результатов по ссылке, но это намного чище. –

+0

большое спасибо, lifesaver! – Liko

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

Было бы весело отлаживать, если вы вызываете функцию несколько раз. –

+0

Point уже обращено. – Dereleased

1

В дополнение к другим ответам, вы могли бы передать адрес массива вокруг внутри вашей функции, но, честно говоря, это далеко не самый лучший способ сделать это.

0

хотя решение Lukáš является самым чистым, поскольку оно не имеет побочных эффектов, оно может быть неэффективным на больших входах, поскольку оно заставляет двигатель постоянно генерировать новые массивы. Есть еще два способа, которые кажутся меньше памяти потребляя

  • имеют результаты массив передается по ссылке, и заменить эхо вызов с $ результат [] =
  • (предпочтительно) обернуть всю историю в классе и использовать $ this-> результат при необходимости

класс подход особенно хорошо, когда используется вместе с 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, это нужно сделать