我有一个只运行一次的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().