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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top