PHP passe par référence dans la fonction récursive ne fonctionne pas
-
06-07-2019 - |
Question
J'utilise deux fonctions pour ajouter ou supprimer des barres obliques d'un combo d'objet / tableau profondément imbriqué. Le premier " niveau " du tableau est toujours un objet, mais certaines de ses propriétés peuvent être des tableaux ou des objets.
Voici mes deux fonctions:
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;
}
Être appelé comme suit:
objSlash( $obj, false );
Cependant, la fonction ne supprime pas les barres obliques du tableau imbriqué. L'objet transmis à la fonction est comme ceci:
stdClass Object
(
[id] => 3
[lines] => Array
(
[0] => Array
(
[character] => Name
[dialogue] => Something including \"quotes\"
)
)
)
Qu'est-ce que j'ai mal fait? Quelque part sur la ligne une référence est en train de disparaître ...
La solution
foreach
utilise une copie du tableau / objet et non le tableau. / object lui-même:
Remarque: sauf si le tableau est référencé ,
foreach
agit sur une copie du tableau spécifié et non sur le tableau lui-même.foreach
a des effets secondaires sur le pointeur du tableau. Ne vous fiez pas au pointeur de tableau pendant ou aprèsforeach
sans le réinitialiser.
Utilisez donc soit une référence:
foreach ($arr as $key => &$field) {
// …
}
Ou utilisez la propriété élément / objet de tableau elle-même, comme le suggère Kuroki Kaze, en utilisant $ arr [$ key]
au lieu de sa valeur copiée $ field
.
Autres conseils
foreach
fait une copie de la valeur, je suppose.
Essayez d’utiliser objSlash ($ arr [$ clé], $ add)
pour lire objSlash (champ $, $ add)
dans foreach
.