【问题标题】:Where to pass temp array when using recursive function?使用递归函数时在哪里传递临时数组?
【发布时间】:2015-11-16 06:57:41
【问题描述】:

我在递归函数中使用了foreach 循环。但是我很难弄清楚在哪里传递我的退货声明。我需要在某个时候返回我的临时数组,但我不知道该怎么做:

<?php
    $patterns = function($array, $temp = array(), $i = 0, $id = 0, $parent = 0) use(&$patterns) {
        $return = null;

        if(array_key_exists($i, $array)) {
            foreach($array[$i] as $set) {
                if($parent == $set['id']) {
                    $data = array(
                        'id' => $set['id'],
                        'parent' => $set['parent']
                    );

                    array_push($temp, $data);
                }

                $patterns($array, $temp, $i + 1, $set['id'], $set['parent']);
            }
        }
    };

    print_r($patterns($rev_relations));
?>

这是我的数据:

Array(
    [0] => Array(
            [0] => Array(
                    [id] => 60
                    [parent] => 55
                )
            [1] => Array(
                    [id] => 57
                    [parent] => 54
                )
        )
    [1] => Array(
            [0] => Array(
                    [id] => 61
                    [parent] => 50
                )
            [1] => Array(
                    [id] => 54
                    [parent] => 49
                )
        )
    [2] => Array(
            [0] => Array(
                    [id] => 49
                    [parent] => 0
                )
        )
)

【问题讨论】:

  • 你能初始化一个示例输入或类似的东西,以便我们实际运行代码吗?
  • 在递归函数中,所有输入必须来自参数,所有输出必须作为返回值。不应考虑其他选项。
  • zerkms,你是对的。我想我已经封装了我需要的一切。

标签: php recursion


【解决方案1】:
<?php


//pass $temp by reference so outside variable gets populated
    $patterns = function($array, &$temp, $i = 0, $id = 0, $parent = 0) use(&$patterns) {
        $return = null;

        if(array_key_exists($i, $array)) {
            foreach($array[$i] as $set) {
                if($parent == $set['id']) {
                    $data = array(
                        'id' => $set['id'],
                        'parent' => $set['parent']
                    );

                    array_push($temp, $data);
                }

                $patterns($array, $temp, $i + 1, $set['id'], $set['parent']);
            }
        }
    };

    //actuall array is created on temp  here
    $temp=array();
    $patterns($rev_relations,$temp);
?>

这行不通吗?从来没有真正使用过无名函数,但这就是我在普通递归函数上的处理方式

好的,拿两个

<?php

    $patterns = function($array, $temp = array(), $i = 0, $id = 0, $parent = 0) use(&$patterns) {
        $return = null;

        if(array_key_exists($i, $array)) {
            foreach($array[$i] as $set) {


          if($parent == $set['id']) {
                $data = array(
                    'id' => $set['id'],
                    'parent' => $set['parent']
                );

                array_push($temp, $data);
            }

            return $patterns($array, $temp, $i + 1, $set['id'], $set['parent']);
        }
    }
    else
    {
       return $temp;
    }
};


$patterns($rev_relations);
?>

【讨论】:

  • 它不会返回任何东西,但会填充 temp。否则你需要一个 if 知道它在哪里结束
  • 为了以后的目的,我需要将数据保留在循环中。
  • 顺便感谢您的帮助。
  • 这是递归函数的标准过程。如果用 return.else 调用自身,则返回
  • 又错了,它不会返回。我的意思是,确实如此。但是空数组。