PHP pasa por referencia en la función recursiva no funciona
-
06-07-2019 - |
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 ...
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 delforeach
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
.