2

SimpleXML オブジェクトのコンテンツをその場で解読する関数を作成しています。

function xmlWalkerDecrypt(&$xmlObj, $aesKey) { 
    if ($xmlObj->count()>0){
        foreach($xmlObj as &$child){      //line 154
            xmlWalkerDecrypt($child, $aesKey);
        }
    }
    else{
        $xmlObj = companyAES($xmlObj, $aesKey, 'decrypt');
    }
} 

これにより、WAMP で次のエラーがスローされます。 Fatal error: An iterator cannot be used with foreach by reference in C:\wamp\www\_assets\walk.php on line 154

出力ではなく参照による編集を目的として、SimpleXML オブジェクトを反復処理することは可能ですか?

私も試しました:

function xmlWalkerDecrypt(&$xmlObj, $aesKey) { 
if ($xmlObj->count()>0){
    foreach($xmlObj->children() as &$child){      //line 154
        xmlWalkerDecrypt($child, $aesKey);
    }
}
else{
    $xmlObj = companyAES($xmlObj, $aesKey, 'decrypt');
}
} 

しかし、それは次のエラーを生成します:

致命的なエラー: C:\wamp\www_assets\myFile.php の 154 行目の一時配列式の要素への参照を作成できません

4

2 に答える 2

0

渡された変数に対して companyAES が何をするかはわかりませんが、役立つ可能性のある 2 つのポイントを次に示します。

  1. xmlWalkerDecrypt のパラメーター 1 は、参照として宣言する必要はありません。PHP のすべてのオブジェクトは参照によって渡されるため、関数宣言にそれを入れる必要はありません。array() はオブジェクトだと思うかもしれませんが、そうではありませんが、 new ArrayObject() はオブジェクトを作成します。http://php.net/manual/en/class.arrayobject.phpを参照してください。

  2. SimpleXMLElement を変更することはできません。属性/子の読み取りまたは追加のみが可能です。ロード/追加後に XML ノードを変更する必要がある場合は、DOMDocument とそれに関連するクラスを使用する必要があります。

于 2013-06-13T20:10:24.353 に答える