2009-08-01 95 views
8

我有兩個函數用於從深度嵌套的對象/數組組合中添加或刪除斜槓。數組的第一個「級別」始終是一個對象,但其中的一些屬性可能是數組或對象。在遞歸函數中不能正常工作的PHP通過參考

這裏是我的兩個功能:

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

被稱爲像這樣:

objSlash($obj, false); 

但是,該函數不會從嵌套數組剝離斜線。傳入函數的對象是這樣的:

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

我做了什麼錯了?沿線某處的參考文獻將會丟失...

回答

14

foreach使用數組/對象,而不是在陣列的拷貝/對象本身:

注:除非數組是referencedforeach上指定數組的一個拷貝,而不是在陣列操作本身。 foreach對數組指針有一些副作用。在不重置它的情況下,不要在foreach期間或之後依賴陣列指針。

所以使用一個參考:

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

或者使用數組元素/對象屬性本身像黑木風建議通過使用$arr[$key]而不是它的複製的值$field

2

foreach使價值的副本,我想。

使用objSlash($arr[$key], $add)嘗試使用objSlash($field, $add) intend內foreach

+0

我想你的意思是:objSlash($ arr [$ key],$ add) – Josh 2009-08-01 13:27:17

+0

是的,當然:) – 2009-08-03 14:11:40