7

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

这是我的两个功能:

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\"
                )
        )
)

我做错了什么?沿线某处缺少参考...

4

2 回答 2

13

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

注意:除非数组被引用,否则foreach对指定数组的副本而不是数组本身进行操作。foreach对数组指针有一些副作用。foreach不要在不重置的情况下或之后依赖数组指针。

所以使用任何一个参考:

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

或者使用数组元素/对象属性本身,例如使用建议的 Kuroki Kaze$arr[$key]代替其复制的 value $field

于 2009-08-01T13:19:01.947 回答
2

foreach我想,复制价值。

尝试使用objSlash( $arr[$key], $add )intead 的objSlash( $field, $add )inside foreach

于 2009-08-01T13:04:35.980 回答