2012-03-25 49 views
1

嗨,我有这样的代码:删除元素用foreach在PHP

$doc = new DOMDocument(); 
$doc->Load('courses.xml'); 
    foreach ($doc->getElementsByTagName('courses') as $tagcourses) 
    { 
     foreach ($tagcourses ->getElementsByTagName('course') as $tagcourse) 
     { 
     if(($tagcourse->getAttribute('instructorId')) == $iid){ 

      $tagcourses->removeChild($tagcourse); 
     } 
     } 
    } 
$doc->Save('courses.xml'); 

,我有一个XML文件:

<courses> 
    <course courseId="1" instructorId="1"> 
    <course_code>456</course_code> 
    <course_name>bil</course_name> 
    </course> 
    <course courseId="2" instructorId="2"> 
    <course_code>234</course_code> 
    <course_name>math</course_name> 
    </course> 
    <course courseId="3" instructorId="2"> 
    <course_code>341</course_code> 
    <course_name>cs</course_name> 
    </course> 
    <course courseId="4" instructorId="2"> 
    <course_code>244</course_code> 
    <course_name>phyc</course_name> 
    </course> 
</courses> 

在这段代码中,我试图删除元素,其具有指定与iid指导员id。问题是所有课程,这个指导员id必须删除。但在我的程序中,只有第一个课程,这个iid被删除。你可以建议一个解决方案?谢谢。

回答

1

getElementsByTagName()正在返回一个活动节点列表。如果你在一个循环中从它中删除一个元素,那么循环会遍历一组不同的元素,而且结果是不可预知的。相反,将要删除的节点存储在数组上,然后迭代并删除它们。

$doc = new DOMDocument(); 
$doc->Load('courses.xml'); 
$to_remove = array(); 

    foreach ($doc->getElementsByTagName('courses') as $tagcourses) 
    { 
     foreach ($tagcourses ->getElementsByTagName('course') as $tagcourse) 
     { 
     if(($tagcourse->getAttribute('instructorId')) == $iid){ 

      $to_remove[] = $tagcourse; 
     } 
     } 
    } 

    // Remove the nodes stored in your array 
    // by removing it from its parent 
    foreach ($to_remove as $node) 
    { 
     $node->parentNode->removeChild($node); 
    } 
$doc->Save('courses.xml'); 
+0

感谢这个有用的答案 – Ozg 2012-03-25 13:37:57

+0

@ozg不客气,很乐意提供帮助。 – 2012-03-25 13:39:34