PHP проход по ссылке в рекурсивной функции не работает - PullRequest
7 голосов
/ 01 августа 2009

У меня есть две функции, которые я использую для добавления или удаления слешей из глубоко вложенного объекта / массива. Первый «уровень» массива всегда является объектом, но некоторые его свойства могут быть массивами или объектами.

Вот мои две функции:

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 ]

13 голосов
/ 01 августа 2009

foreach использует копию массива / объекта, а не сам массив / объект:

Примечание: Если массив не является ссылкой , foreach работает с копией указанного массива, а не с самим массивом. foreach имеет некоторые побочные эффекты на указатель массива. Не полагайтесь на указатель массива во время или после foreach без его сброса.

Так что используйте либо ссылку:

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

Или используйте само свойство элемента массива / объекта, как предложил Kuroki Kaze, используя $arr[$key] вместо его скопированного значения $field.

2 голосов
/ 01 августа 2009

foreach делает копию значения, я полагаю.

Попробуйте использовать objSlash( $arr[$key], $add ) целое число objSlash( $field, $add ) внутри foreach.

...