如何存储此递归函数的结果?

时间:2010-03-01 18:49:21

标签: php recursion

我有以下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);

但是,我的问题是我需要将结果存储在一个数组中以便以后处理,而不是仅仅将它们打印出去,但我不知道如何在不使用全局变量的情况下完成这项工作。

有没有人知道另一种方法来实现类似的东西或修改它以给我我可以使用的结果?

6 个答案:

答案 0 :(得分:11)

归还他们。让showCombinations()返回项目列表。在第一种情况下,您只返回一个项目,在另一个递归情况下,您返回一个列表,其中包含所有返回的列表。例如:

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

答案 1 :(得分:1)

除了其他答案,您可以在函数内部传递数组的地址,但老实说,这并不是最好的方法。

答案 2 :(得分:0)

将结果存储在$ _SESSION变量中。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

虽然Lukáš的解决方案是最纯粹的,因为它没有副作用,但它可能对大输入无效,因为它迫使引擎不断生成新的数组。还有两种方式似乎消耗更少的内存

  • 有一个通过引用传递的结果数组,并用$ result [] =
  • 替换echo调用
  • (首选)将整个故事包装成一个类,并在适当时使用$ this-&gt;结果

与php迭代器一起使用时,类方法特别好用

答案 5 :(得分: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时它重新