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 ...

Était-ce utile?

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ès foreach 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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top