PHP Durchlauf durch Bezugnahme in rekursiver Funktion nicht funktionierend
-
06-07-2019 - |
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 ...
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 derforeach
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.