PHP passa per riferimento nella funzione ricorsiva non funzionante
-
06-07-2019 - |
Domanda
Ho due funzioni che sto usando per aggiungere o rimuovere le barre da una combinazione oggetto / matrice profondamente annidata. Il primo "livello" dell'array è sempre un oggetto, ma alcune delle sue proprietà possono essere array o oggetti.
Ecco le mie due funzioni:
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;
}
Essere chiamato così:
objSlash( $obj, false );
Tuttavia, la funzione non elimina le barre dall'array nidificato. L'oggetto passato nella funzione è così:
stdClass Object
(
[id] => 3
[lines] => Array
(
[0] => Array
(
[character] => Name
[dialogue] => Something including \"quotes\"
)
)
)
Cosa ho fatto di sbagliato? Da qualche parte lungo la linea manca un riferimento ...
Soluzione
foreach
utilizza una copia dell'array / oggetto e non dell'array / oggetto stesso:
Nota: a meno che l'array non sia referenziato ,
foreach
opera su una copia dell'array specificato e non dell'array stesso.foreach
ha alcuni effetti collaterali sul puntatore dell'array. Non fare affidamento sul puntatore di array durante o dopo ilforeach
senza ripristinarlo.
Quindi usa un riferimento:
foreach ($arr as $key => &$field) {
// …
}
Oppure usa la proprietà element / object dell'array stesso come suggerito da Kuroki Kaze usando $ arr [$ key]
invece del suo valore copiato $ field
.
Altri suggerimenti
foreach
crea una copia di valore, suppongo.
Prova a usare objSlash ($ arr [$ key], $ add)
invece di objSlash ($ field, $ add)
all'interno di foreach
.