SimpleXML删除节点

use*_*003 1 php xml simplexml

我有一个只运行一次的foreach循环,它让我难过.

1:我加载了一系列状态值("请求","删除"或"已购买")

2:然后我加载一个xml文件,需要循环"代码"节点并更新它们的状态,但是如果新代码是"删除"我想删除它然后转移到下一个

XML结构是......

<content>
.... lots of stuff
<codes>
<code date="xxx" status="request">xxxxx</code>
.. repeat ...
</codes>
</content>
Run Code Online (Sandbox Code Playgroud)

和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);
Run Code Online (Sandbox Code Playgroud)

我暂时删除了更新,因此我可以调试删除检查.这一切都有效,但它只删除第一个删除并留下所有其他删除,即使它是一个foreach循环?任何帮助非常感谢.

hak*_*kre 13

在同一次迭代中多次删除是不稳定的.例如,如果删除第二个元素,则第三个元素成为第二个元素,依此类推.

您可以通过先将要删除的元素存储到数组中来防止这种情况:

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

然后在迭代它的同时删除基于数组的元素:

foreach ($elementsToRemove as $code) {
    unset($code[0]);
}
Run Code Online (Sandbox Code Playgroud)

您还可以将if条件放入xpath查询中,该查询会直接返回数组(请参阅重复的问题以获取示例)或使用iterator_to_array().