2009-08-01 26 views
8

深く入れ子にされたオブジェクト/配列コンボからスラッシュを追加または削除するために使用している関数が2つあります。配列の最初の「レベル」は常にオブジェクトですが、そのプロパティの一部は配列またはオブジェクトです。ここで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アレイ/オブジェクトではなく、配列/オブジェクト自体のコピーを使用する:

をアレイreferencedない限り、foreachは、指定された配列としない配列のコピー上で動作します自体。 foreachには、配列ポインタにいくつかの副作用があります。 foreachのリセット中またはリセット後にアレイポインタに依存しないでください。

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

するか、黒木風ではなく、そのコピーした値$field$arr[$key]を使用して提案のような配列要素/オブジェクトのプロパティ自体を使用する:

に基準のいずれかを使用します。

+0

ありがとう、 '&$フィールド'働いた! – DisgruntledGoat

2

foreachは値のコピーを作成します。

objSlash($arr[$key], $add)objSlash($field, $add)の内側に入れてみてください。foreachです。

+0

私はあなたが意味すると思う:objSlash($ arr [$ key]、$ add) – Josh

+0

もちろん、:) –

関連する問題