Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用PHP函数本身_Php_Recursion - Fatal编程技术网

调用PHP函数本身

调用PHP函数本身,php,recursion,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) {

在下面的脚本中,函数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);

}你的问题:

如果我理解正确,你想知道函数在这行中做什么

 $data[clean($key)] = clean($value);
答案是:

请参阅,该函数的主要目的是使用php的方法从字符串中删除斜杠

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

在php中,数组类似于hashmaps,您可以使用如下循环迭代键和值

 foreach ($data as $key => $value) {....}
因此,如果您想在代码片段中总结算法,可以如下所示

  • 检查输入是否为数组。如果不是,则转至步骤4
  • 对于数组的每个项,通过调用其上的clean方法(递归)来清除键和值
  • 返回数组
  • 使用stripslashes方法清除输入字符串 5返回已清理的输入

  • 根据我的理解,它不是在清理密钥,而是在未清理的密钥保留的情况下使用一个干净的密钥创建一个新元素

    $a['foo\bar']:val\ue

    变成

    $a['foo\bar']:val\ue

    $a['foobar']:值


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

    如果这样说,也许你会更好地理解代码:

    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=>foo',1=>array('bar'=>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');
    

    您可能应该阅读以下内容:

    函数的主要用途是清除关联数组或单个变量。关联数组是一个数组,您可以在其中定义键和该键的值;PHP中使用的特殊数组也是如此,比如
    $\u GET
    $\u POST
    等等

    “清理”的意思是检查幻方引号是否处于活动状态——这会导致在将动态数据发布到PHP页面时,这些数组中的某些字符被反斜杠转义。
    $\u GET[“斯佳丽”]=“O'Hara”
    用神奇的引号变成
    $\u GET[“斯佳丽”]=“O'Hara”

    因此,如果magic quotes处于活动状态,该函数将处理此问题,并删除斜杠,以便字符串保留正确的值,而不是转义值

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

    $string = "Escapes\'in\'a string";
    clean($string);
    
    • 它是一个数组吗?否。然后返回条带斜杠(我的数据)

      $array=array(“键”“带”“转义符”=>“值”“带”“转义符”,“另一个”“键”=>“另一个值”); 清洁($阵列)

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

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


    我认为这个功能不能正常工作。有人有同样的感觉吗?我还没有测试过它,但它似乎不是在替换键/值的意义上“清理”键/值,而是在未清理版本的基础上添加已清理版本。

    您应该将
    ini\u get
    调用替换为
    get\u magic\u quotes\u gpc()
    。我很确定密钥不会被转义,所以你可能想测试一下,然后删除
    clean($key)
    ,除非它们真的被转义了。我不明白这个问题。。。你想知道什么?谢谢Hasan,我知道函数在做什么,但请看步骤2。当数据是数组时,函数clean将如何清理数据,因为stripslashes将仅在else部分触发??????????如果数据是数组,那么if部分如何给出期望的结果,这是我的问题或关注点。好的,我已经看到了@cravo给出的答案,他已经很好地解释了脚本的实际内容及其逻辑。顺便说一句,谢谢大家…………您的回答很好,并且捕捉到了脚本正在做的事情,但此脚本是opencart scource的一部分,可能工作得很好,否则opencart将失败,因为函数是在其核心中定义的。