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

发布于 2024-07-30 20:14:47 字数 1351 浏览 4 评论 0原文

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

这是我的两个函数:

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

我做错了什么? 沿着这条线的某个地方,参考文献丢失了......

I have two functions that I'm using to add or remove slashes from a deeply nested object/array combo. The first "level" of the array is always an object, but some of its properties may be arrays or objects.

Here are my two functions:

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;
}

Being called like so:

objSlash( $obj, false );

However, the function does not strip the slashes from the nested array. The object passed into the function is like this:

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

What have I done wrong? Somewhere along the line a reference is going missing...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

关于从前 2024-08-06 20:14:47

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

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


因此,请使用引用:

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

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

foreach uses a copy of the array/object and not the array/object itself:

Note: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.

So use either a reference:

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

Or use the array element/object property itself like Kuroki Kaze suggested by using $arr[$key] instead of its copied value $field.

阳光下慵懒的猫 2024-08-06 20:14:47

我想,foreach 制作了值的副本。

尝试在 foreach 中使用 objSlash( $arr[$key], $add ) 而不是 objSlash( $field, $add )

foreach makes a copy of value, i suppose.

Try using objSlash( $arr[$key], $add ) intead of objSlash( $field, $add ) inside foreach.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文