2009-08-01 9 views
8

Mam dwie funkcje, których używam do dodawania lub usuwania ukośników z głęboko zagnieżdżonego zestawu obiektów/tablic. Pierwszy "poziom" tablicy jest zawsze obiektem, ale niektóre jej właściwości mogą być tablicami lub obiektami.Przekazywanie PHP przez odwołanie w funkcji rekursywnej nie działa

Oto moje dwie funkcje:

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

miano tak:

objSlash($obj, false); 

Jednakże funkcja nie pozbawić ukośniki z zagnieżdżonego tablicy. Obiekt przekazany do funkcji jest następujący:

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

Co zrobiłem źle? Gdzieś wzdłuż linii brakuje odniesienia ...

Odpowiedz

14

foreach wykorzystuje kopię tablicy/obiektu i nie tablicy/samego obiektu:

Uwaga: Jeżeli matryca jest referenced, foreach działa na kopii określonej tablicy, a nie tablicy samo. foreach ma pewne skutki uboczne na wskaźnik tablicy. Nie należy polegać na wskaźniku tablicy podczas lub po foreach bez resetowania go.

więc użyć odniesienia:

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

też użyć samego elementu tablicy/właściwości obiektu jak Kuroki Kaze zaproponował za pomocą $arr[$key] zamiast skopiowaną wartość $field.

+0

Dzięki, '& $ field' działało! – DisgruntledGoat

2

foreach tworzy kopię wartości, tak przypuszczam.

Spróbuj użyć intruza z objSlash($field, $add) wewnątrz foreach.

+0

Myślę, że chodziło Ci o: objSlash ($ arr [$ key], $ add) – Josh

+0

Tak, oczywiście :) –