【问题标题】:Function calls itself, is this possible?函数调用自己,这可能吗?
【发布时间】:2013-12-24 12:29:13
【问题描述】:

我一直在互联网上寻找更多关于 PHP 中的清理和验证的信息,这是我第二次遇到这种类型的函数,但我在理解这个 foreach 语句的工作原理时遇到了一些困难。

这是代码,取自here

function sanitize($input) {
    if (is_array($input)) {
        foreach($input as $var=>$val) {
            $output[$var] = sanitize($val);
        }
    }
    else {
        if (get_magic_quotes_gpc()) {
            $input = stripslashes($input);
        }
        $input  = cleanInput($input);
        $output = mysql_real_escape_string($input);
    }
    return $output;
}

所以我的疑问在于 $input is_array 的 foreach 语句,其中数组的每个索引都通过正在创建的函数传递。对于像我这样的新手程序员,我不确定如何在它的创建过程中调用一些东西。

我已经做了一些传递,咀嚼这个想法,并认为我已经找到了答案,但我不确定是否是这样,这就是我问这个问题的原因,以确认和指导一些文献这可能有助于我掌握这种类型的“使用”。

所以我在想,当函数被调用sanitize($someArray); 时,它将在 if 语句上评估为 true 并运行 foreach。在每个索引上运行sanitize($val); 时,它将跳转到else 语句并运行“单值”指令。当然,除非$input 是一个数组数组,在这种情况下,它将重复第一步,直到每个数组中的每个项目都被清除。

我的疑惑出现了,因为这在某种程度上是我所看到的:

function sanitize($input) {
    if(foo){sanitize($input->i);}
    else {...}
}

我本能地期待一个无限循环。

这有意义吗?这是代码中的错误吗?它是否有无限期运行的机会?

【问题讨论】:

    标签: php arrays function recursion sanitization


    【解决方案1】:

    函数在创建之后才会被调用。它只对原始输入的一小部分进行操作。最终会到达不是数组的东西,递归的级别会下降。

    【讨论】:

    • +1 为清楚起见并提到“递归”一词,这使我进行了进一步的研究,但是我觉得 Jelle 的答案覆盖了更广泛的 stackOverflow 用户,但感谢您的快速回复
    【解决方案2】:

    不,它是递归的,但不会运行,直到死亡将我们分开。

    您有一个函数 sanitize (sanitize.1) 的实例。那收到了一个数组。因为它是一个数组,所以它确实会调用一个函数 sanitize(为了清楚起见,我们称之为 Sanitize.2)。在 sanitize.1 旁边运行。

    但是,在 sanitize.1 中,您只需将单个值传递给函数。所以确实,它跳转到函数的 else 部分。清理变量。返回净化后的输入,然后再次消失。那时,sanitize.1 会跳到数组中的下一个元素,然后再次运行整个事情。

    在您传递的数组的每个元素也是一个数组的情况下,它仍然有效:每个子数组都以相同的方式处理,您会得到 sanitize.1 调用 sanitize.2,而后者又调用 sanitize.3。你可以无限期地做到这一点。由于计算机非常擅长跟踪他们在做什么,他们可以做到这一点,你和我在一张纸上会把它弄得一团糟;D

    【讨论】:

    • 您是否介意编辑您的答案以添加“递归”一词,以使您的答案对于其他进入此问题的用户来说更完整一点?感谢您的快速回复
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多