我有一个代码只删除过期的xml标记并列出其他标记,但如果一个标记过期,它将删除它并停止foreach循环执行而不列出其他标记。如果我在代码完成删除过期标记后重新加载页面,它将正常列出其他标记没有任何问题。如何让它继续列出其他标签?
php代码:
$xml_file = simplexml_load_file("xml_file.xml");
foreach ($xml_file as $item)
{
$current_date = time();
$article_date = (int)$item->date;
$item_number = (int)str_replace("a" , "" ,$item->getName());
if ($current_date >= $article_date + 100000)
{
if ($item->children()->getName() == "a")
{
$dom = dom_import_simplexml($item);
$dom->parentNode->removeChild($dom);
$return = simplexml_import_dom($dom);
$xml_file->asXML('xml_file.xml');
unlink('file.html');
}
}
elseif ($current_date < $article_date + 100000)
{
echo 'hello';
}
}
xml代码:
<articles>
<a1><a>gr</a><date>14</date></a1>
<a2><a>gr</a><date>1414141414141414</date></a2>
<a3><a>gr</a><date>1414141414141414</date></a3></articles>
此代码应该删除第一个标记并打印两次hello,但它只删除第一个标记并停止foreach循环执行而不打印任何东西,如果我在删除第一个标记后重新加载页面它会打印两次没有任何标记问题
答案 0 :(得分:1)
有些行被评论,因为它们的目的不明确......你可以删除,但不能使用foreach
循环,你必须从最后开始...否则就像删除你自己的椅子 - 循环目前还不清楚,是否应该从'新'$项开始,或跳过它。
$children = $xml_file->children();
for($i = count($children) - 1; $i >= 0; $i--)
{
$item = $children[$i];
$current_date = time();
$article_date = (int)$item->date;
$item_number = (int)str_replace("a" , "" ,$item->getName());
if ($current_date >= $article_date + 100000)
{
if ($item->children()->getName() == "a")
{
$dom = dom_import_simplexml($item);
$dom->parentNode->removeChild($dom);
// $return = simplexml_import_dom($dom);
// $xml_file->asXML('xml_file.xml');
// unlink('file.html');
}
}
elseif ($current_date < $article_date + 100000)
{
echo 'hello';
}
}
var_dump($xml_file);
在不转换为DOM的情况下删除子项的另一种方法是
$children = &$xml_file->children();
// the rest is the same, but replace
// $dom = dom_import_simplexml($item);
// $dom->parentNode->removeChild($dom);
// with
unset($children[$i]);