php中的递归函数

时间:2014-12-26 00:57:59

标签: php class recursion

这个函数在类之外工作正常。即只是定义函数并调用它。然而,当我把它添加到课堂上它不再有效 - 任何帮助都非常感激:

public function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;    

        if($needle===$value || (is_array($value) && $this->recursive_array_search($needle,$value) !== false)) {

            return $current_key;
        }
    }
    return false;
}

很明显, $ this 在不在课堂时被移除。

编辑: 我在课堂上使用它时遇到的错误是:

  

为foreach()提供的参数无效   app \ components \ GenFun :: recursive_array_search(' 9377907',9378390)

我对该功能的唯一期望是它返回任何键(即识别针存在于大海捞针中) - 我实际上并不关心实际索引。

2 个答案:

答案 0 :(得分:0)

说实话," 它不再有效"不是一个有用的指标,可以帮助您调试问题。也不是" 它工作正常",因为它没有告诉我们你对的工作的含义的定义。更确切地说,这些陈述并没有告诉我们您希望代码执行的操作是什么,或者代码执行的操作是您没想到的。

对我来说,这段代码完全按照你所说的去做,而且函数和类方法(使用相同的代码)的结果是相同的...... See the working 3v4l pastebin here

然而,我的猜测是你的期望可能与这段代码实际上的不同。具体来说,此函数将在$needle的{​​{1}}的第一个匹配位置返回。这样下面的数组返回$haystack(_的针是0)。

'foo'

它还将仅返回$haystack = ['foo', ['foo', 'bar']]; 最外层数组的键。意思是,以下数组返回$haystack作为键。即使实际匹配位于0

$haystack[0][1][2]

因此,根据您的预期(最内层密钥或最外层密钥),您可能认为此功能无效。

因此,您需要明确说明您希望代码执行的操作,并提供一些可重复的示例(,其中包括使用的数据或提供给函数的参数< / em>的)。


<强> 编辑:

嘿,我很高兴你明白了。以下是一些建议,可能会帮助您稍微重构此代码...

因此,既然您在阵列的任何部分都在寻找针的存在并且实际上并不关心密钥,那么您可能希望在逻辑中使您的意图更加明显。

因此,例如,总是返回一个布尔值(成功时为$haystack = [['bar',['quix','baz','foo'],'baz'],'quix']; ,失败时返回true),而不是在失败时返回false,并在成功时返回关键。这使得从调用者的角度检查函数的结果更容易和更清晰。另外,考虑命名函数以更清楚地描述它的意图(例如:false而不是in_array_recursive,因为我们实际上并不打算在数组中搜索某些东西,而是证明某些东西实际上是 in 数组)。最后,考虑避免在同一函数中使用多个返回点,这会使调试更加困难。

因此,编写相同代码的更简洁方法可能是这样的:

recursive_array_search

现在来电者只是......

public function in_array_recursive($needle, $haystack, $strict = false) {

    $result = false;

    foreach($haystack as $value) {

        if(!is_array($value)) {
            $result = $strict ? $needle === $value : $needle == $value;
        } else {
            $result = $this->in_array_recursive($needle, $value, $strict);
        }

        if ($result) {
            break;
        }

    }

    return $result;

}

使代码更易读,更容易调试。请注意,如果您希望在函数末尾为$arr = ['bar',['foo']]; if (in_array_recursive('foo', $arr)) { /* 'foo' is in $arr! */ } else { /* 'foo' is not in $arr... */ } 添加可选参数,并且与$strict更加内联,则也不必使用完全匹配。

答案 1 :(得分:0)

所以这不起作用的原因是由于我定义$ needle的方法。

在我的旧代码中,它将作为整数输入,在我的新代码中,它是一个字符串。然后===运算符明显否认它是相同的。这就是你不在凌晨2点工作的原因:)