本身调用PHP函数

时间:2012-05-25 07:01:13

标签: php recursion

在下面的脚本函数中,clean($ data)在其中调用它,我理解但它是如何清除语句 $ data [clean($ key)] = clean($ value); < /强> ???任何帮助表示赞赏..我正在努力解决这个问题,因为我是PHP的新手。问候。

if (ini_get('magic_quotes_gpc')) {
function clean($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[clean($key)] = clean($value);
        }
    } else {
        $data = stripslashes($data);
    }

    return $data;
}           

$_GET = clean($_GET);
$_POST = clean($_POST);
$_REQUEST = clean($_REQUEST);
$_COOKIE = clean($_COOKIE);

}

4 个答案:

答案 0 :(得分:1)

您的问题:

因此,如果我正确地记录你想知道行中的功能是什么

 $data[clean($key)] = clean($value);

答案:

看到该函数的主要目的是使用php的stripslashes方法从字符串中删除斜杠。

如果输入项是一个数组,那么它会尝试通过调用键和值来清理数组的键以及数组的值。

在php数组中就像哈希映射一样,你可以使用foreach循环遍历键和值,如下所示

 foreach ($data as $key => $value) {....}

因此,如果您想在代码段中总结算法,那么它将在

下面
  1. 检查输入是否为数组。如果不是,那么转到第4步
  2. 对于每个数组项,通过调用干净方法(递归)来清除键和值
  3. 返回数组
  4. 使用stripslashes方法清理输入字符串 5返回已清理的输入

答案 1 :(得分:0)

根据我的理解,它不会清理密钥,但会在未清洁的密钥保留的情况下创建一个带有干净密钥的新元素。

$ a [&#39; foo \ bar&#39;]:val \ ue

变为

$ a [&#39; foo \ bar&#39;]:val \ ue

$ a [&#39; foobar&#39;]:值

如果我错了,有人会纠正我。

答案 2 :(得分:0)

如果采用这种方式,也许你会更好地理解代码:

foreach ($data as $key => $value) {
            $key = clean($key); // Clean the key, the
            $value = clean($value); // Clean the value
            $data[$key] = $value; // Put it in the array that will be returned
        }

假设您有一个这样的数组: $ _POST = array(0 =&gt;'foo',1 =&gt; array('bar'=&gt;'baz')); 将发生以下情况:

Call clean($_POST);
call clean 0
call clean 'foo'
$return[0] = 'foo'
call clean 1
call clean 'bar'
call clean 'baz'
$return[1] = array('bar' => 'baz');

你应该读这个:http://www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

答案 3 :(得分:0)

该函数的主要目的是清理关联数组单个变量。关联数组是一个数组,您可以在其中为该键定义键和值; PHP中使用的特殊数组也是如此$_GET $_POST等等。

“清理”的含义是检查魔术引号是否处于活动状态 - 这会导致在将动态数据发布到PHP页面时使用反斜杠转义这些数组中的某些字符。 $_GET["Scarlett"] = "O' Hara"变为魔术引号$_GET["Scarlett"] = "O\' Hara"

因此,如果魔术引号处于活动状态,则该函数会处理此问题,并且会删除斜杠,以便字符串保留其正确的,而不是转义的值。

该算法检查传递给函数的数据是否为数组,如果不是,则直接清除该值。

$string = "Escapes\'in\'a string";
clean($string);
  • 是一个数组吗?不。然后返回stripslashes(我的数据)

    $ array = array(“key \”with \'escapes“=&gt;”value \“with \'escapes”,“another \'key”=&gt;“another value”); 清洁($阵列)

  • 是一个数组吗?是。因此,使用foreach遍历每个键/值对,取出键并像第一个示例一样清理它;然后获取值并执行相同操作并将清理后的版本放入数组中。

如您所见,该函数有两个不同的行为,这些行为由“if”语句区分。 如果传递一个数组,则激活第二个行为,该行为依次传递 strings ,而不是数组,从而触发第一个行为。

我的想法是,这个功能无法正常工作。任何人都有同样的感觉?我还没有测试它,但它似乎并没有“清理”替换它们的意义上的键/值,但添加清理后的版本沿着未清理的版本。