Pregunta

Tengo dos funciones que estoy usando para agregar o eliminar barras de una combinación de objeto / matriz profundamente anidada. El primer '' nivel '' de la matriz siempre es un objeto, pero algunas de sus propiedades pueden ser matrices u objetos.

Aquí están mis dos funciones:

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

Ser llamado así:

objSlash( $obj, false );

Sin embargo, la función no elimina las barras de la matriz anidada. El objeto pasado a la función es así:

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

¿Qué he hecho mal? En algún punto de la línea falta una referencia ...

¿Fue útil?

Solución

foreach usa una copia de la matriz / objeto y no la matriz / objeto en sí:

  

Nota: a menos que la matriz sea referenciada , foreach opera en una copia de la matriz especificada y no en la matriz misma. foreach tiene algunos efectos secundarios en el puntero de la matriz. No confíe en el puntero de matriz durante o después del foreach sin reiniciarlo.

Entonces use una referencia:

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

O utilice la propiedad de elemento / objeto de matriz en sí, como Kuroki Kaze sugirió utilizando $ arr [$ key] en lugar de su valor copiado $ field .

Otros consejos

foreach hace una copia de valor, supongo.

Intente usar objSlash ($ arr [$ key], $ add) en lugar de objSlash ($ field, $ add) dentro de foreach .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top