PHP在递归函数中通过引用传递不起作用

时间:2009-08-01 13:02:23

标签: php recursion pass-by-reference

我有两个函数用于在深层嵌套的对象/数组组合中添加或删除斜杠。数组的第一个“级别”始终是一个对象,但它的一些属性可能是数组或对象。

以下是我的两个功能:

function objSlash( &$obj, $add=true )
{
    foreach ( $obj as $key=>$field )
    {
        if ( is_object( $field ) )
            objSlash( $field, $add );
        else if ( is_array( $field ) )
            arrSlash( $field, $add );
        else if ( $add )
            $obj->$key = addslashes( $field );
        else
            $obj->$key = stripslashes( $field );
    }

    return;
}

function arrSlash( &$arr, $add=true )
{
    foreach ( $arr as $key=>$field )
    {
        if ( is_object( $field ) )
            objSlash( $field, $add );
        else if ( is_array( $field ) )
            arrSlash( $field, $add );
        else if ( $add )
            $arr[$key] = addslashes( $field );
        else
            $arr[$key] = stripslashes( $field );
    }

    return;
}

像这样被召唤:

objSlash( $obj, false );

但是,该函数不会从嵌套数组中删除斜杠。传递给函数的对象是这样的:

stdClass Object
(
    [id] => 3
    [lines] => Array
        (
            [0] => Array
                (
                    [character] => Name
                    [dialogue] => Something including \"quotes\"
                )
        )
)

我做错了什么?沿着这条线的某处,参考文献不见了......

2 个答案:

答案 0 :(得分:14)

foreach使用数组/对象的副本而不是数组/对象本身:

  

注意:除非数组为referenced,否则foreach将对指定数组的副本进行操作,而不是数组本身。 foreach对数组指针有一些副作用。在foreach期间或之后,不要依赖数组指针而不重置它。

所以使用参考:

foreach ($arr as $key => &$field) {
    // …
}

或者使用数组元素/对象属性本身,如使用$arr[$key]而不是复制的值$field建议的Kuroki Kaze。

答案 1 :(得分:2)

我想,

foreach会复制价值。

尝试在objSlash( $arr[$key], $add )内使用objSlash( $field, $add )代替foreach