Resursive函数不返回所有元素

时间:2016-10-24 11:18:19

标签: php recursion

我有一个非常愚蠢的问题,但我正在看半个小时的代码,无法弄清楚如何解决它。

我正在研究一些更复杂的迭代器,但我会在这个简单的例子上显示问题:

public function test($obj = null)
{
    $test = array(
        'Level 1 A' => array(
            'Level 2 A' => 1,
            'Level 2 B' => array(
                'Level 3 A' => 2,
                'Level 4 B' => 3,
            )
        ),
        'Level 1 B' => array(
            'Level 2 C' => 4
        )
    );

    if ($obj) {
        $test = $obj;
    }


    foreach ($test as $key => $value) {
        var_dump($key);
        if (is_array($value)) {
            return $this->test($value);
        }
    }

    return $value;
}

问题是此函数不输出Level 1 B和子元素。 我知道这是一个非常新手的问题,但我需要一个有新面貌的人。

2 个答案:

答案 0 :(得分:0)

foreach循环中的return语句在遇到第一个数组()之后将结束递归,因此不会处理第二个数组。

答案 1 :(得分:0)

看起来你需要递归generator

此函数将在您的数据结构中移动并返回它遇到的所有值:

function iterate($data) {
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            yield from iterate($value);
        }
        else {
            yield $value;
        }
    }
}

你可以像这样使用它:

foreach (iterate($test) as $value) {
    // do something with $value
}