1

一度しか実行されない foreach ループがあり、困惑しています。

1: ステータス値の配列をロードします (「リクエスト」、「削除」、または「購入済み」のいずれか)。

2:次にxmlファイルをロードし、「コード」ノードをループしてステータスを更新する必要がありますが、新しいコードが「削除」されている場合は、次のコードに移動する前に削除したい

XML構造は....

<content>
.... lots of stuff
<codes>
<code date="xxx" status="request">xxxxx</code>
.. repeat ...
</codes>
</content>

PHPコードは...

$newstatus = $_POST['updates'];
$file = '../apps/templates/'.$folder.'/layout.xml';
$xml2 = simplexml_load_file($file);
foreach($xml2->codes->code as $code){
    if($code['status'] == "delete") {
        $dom=dom_import_simplexml($code);
        $dom->parentNode->removeChild($dom);
    }
}
$xml2->asXml($file);

削除チェックをデバッグできるように、更新を一時的に削除しました。これはすべて機能しますが、最初の削除のみを削除し、foreach ループであっても他のすべての削除を残します??. どんな助けでも大歓迎です。

4

2 に答える 2

13

同じ繰り返しで複数回削除すると不安定になります。たとえば、2 番目の要素を削除すると、3 番目の要素が 2 番目になります。

最初に削除する要素を配列に格納することで、これを防ぐことができます。

$elementsToRemove = array();
foreach ($xml2->codes->code as $code) {
    if ($code['status'] == "delete") {
        $elementsToRemove[] = $code;
    }
}

次に、反復処理中に安定している配列に基づいて要素を削除します。

foreach ($elementsToRemove as $code) {
    unset($code[0]);
}

また、if 条件を、配列を直接返す xpath クエリに入れることもできます (例については、重複した質問を参照してください) iterator_to_array()

于 2013-06-22T08:32:06.650 に答える