Frage

Ich habe zwei Funktionen, die ich verwende Schrägstriche aus einer tief verschachtelten Objekt / Array Combo hinzuzufügen oder zu entfernen. Die erste „Ebene“ des Arrays ist immer ein Objekt, aber einige seiner Eigenschaften können Arrays oder Objekte sein.

Hier sind meine zwei Funktionen:

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;
}

bezeichnet zu werden, wie so:

objSlash( $obj, false );

Allerdings ist die Funktion nicht die Schrägstriche aus dem verschachtelten Array abzustreifen. Das Objekt übergeben in die Funktion ist wie folgt:

stdClass Object
(
    [id] => 3
    [lines] => Array
        (
            [0] => Array
                (
                    [character] => Name
                    [dialogue] => Something including \"quotes\"
                )
        )
)

Was habe ich falsch gemacht? Irgendwo entlang der Linie eine Referenz wird vermisst ...

War es hilfreich?

Lösung

foreach verwendet eine Kopie des Arrays / Objekt und nicht das Array / Objekt selbst:

  

Hinweis: Es sei denn, das Array verwiesen betreibt foreach auf einer Kopie des angegebenen Arrays und nicht das Array selbst. foreach hat einige Nebenwirkungen auf dem Array-Zeiger. Nicht während oder nach der foreach auf dem Array Zeiger verlassen, ohne es zurückzusetzen.

So verwenden entweder eine Referenz:

foreach ($arr as $key => &$field) {
    // …
}

oder verwenden Sie die Array-Element / Objekt-Eigenschaft selbst wie Kuroki Kaze unter Verwendung $arr[$key] statt dem kopierten Wert $field vorgeschlagen.

Andere Tipps

foreach macht eine Kopie von Wert, nehme ich an.

Versuchen objSlash( $arr[$key], $add ) statt objSlash( $field, $add ) innerhalb foreach verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top