7

深くネストされたオブジェクト/配列の組み合わせからスラッシュを追加または削除するために使用している2つの関数があります。配列の最初の「レベル」は常にオブジェクトですが、そのプロパティの一部は配列またはオブジェクトである場合があります。

これが私の2つの機能です。

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) {
    // …
}

$arr[$key]または、コピーされた値の代わりにを使用して提案された黒木風のような配列要素/オブジェクトプロパティ自体を使用します$field

于 2009-08-01T13:19:01.947 に答える
2

foreach値のコピーを作成すると思います。

内部objSlash( $arr[$key], $add )の代わりに使用してみてください。objSlash( $field, $add )foreach

于 2009-08-01T13:04:35.980 に答える