2009-08-01 7 views
8

Ich habe zwei Funktionen, die ich verwenden, um Schrägstriche aus einem tief verschachtelten Objekt/Array-Kombination hinzuzufügen oder zu entfernen. Die erste "Ebene" des Arrays ist immer ein Objekt, aber einige seiner Eigenschaften können Arrays oder Objekte sein.PHP übergeben durch Verweis in rekursive Funktion nicht funktioniert

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

wie so bezeichnet zu werden:

objSlash($obj, false); 

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

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

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

Antwort

14

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

Hinweis: Es sei denn, das Array referenced ist, foreach auf einer Kopie des angegebenen Arrays arbeitet und nicht das Array selbst. foreach hat einige Nebenwirkungen auf den Array-Zeiger. Verlassen Sie sich nicht auf den Array-Zeiger während oder nach der foreach, ohne ihn 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.

+0

Danke, '& $ field' hat funktioniert! – DisgruntledGoat

2

foreach macht eine Kopie von Wert, nehme ich an.

Versuchen Sie mit objSlash($arr[$key], $add) intead von objSlash($field, $add) innerhalb foreach.

+0

Ich denke, du meintest: objSlash ($ arr [$ key], $ hinzufügen) – Josh

+0

Ja, natürlich :) –

Verwandte Themen