在php中使用foreach从xml文件中删除元素

在php中使用foreach从xml文件中删除元素,php,xml,Php,Xml,嗨,我有这样一个代码: $doc = new DOMDocument(); $doc->Load('courses.xml'); foreach ($doc->getElementsByTagName('courses') as $tagcourses) { foreach ( $tagcourses ->getElementsByTagName('course') as $tagcourse) { if(($tagc

嗨,我有这样一个代码:

$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>

456
比尔
234
数学
341
反恐精英
244
物理

在这段代码中,我试图删除具有iid指定的讲师id的元素。问题是所有具有此讲师id的课程都必须删除。但在我的程序中,只有第一个具有此iid的课程被删除。您能提出解决方案吗?谢谢。

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');

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');

谢谢你的回答谢谢你的回答