我有一个只运行一次的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循环? 非常感谢任何帮助。
答案 0 :(得分:13)
在同一次迭代中多次删除是不稳定的。例如。如果删除第二个元素,则第三个元素成为第二个元素,依此类推。
您可以先将要删除的元素存储到数组中来阻止这种情况:
$elementsToRemove = array();
foreach ($xml2->codes->code as $code) {
if ($code['status'] == "delete") {
$elementsToRemove[] = $code;
}
}
然后在迭代它的同时删除基于数组的元素:
foreach ($elementsToRemove as $code) {
unset($code[0]);
}
您还可以将if条件放入xpath查询中,该查询会直接返回数组(有关示例,请参阅the duplicate question)或使用iterator_to_array()
。