javascript – 在foreach中重新索引dom的DomDocument removeChild

我试图删除带有data-spotid属性的p标签

        $dom = new DOMDocument();
        @$dom->loadHTML($description);
        $pTag = $dom->getElementsByTagName('p');

        foreach ($pTag as $value) {
            /** @var DOMElement $value */
            $id = $value->getAttribute('data-spotid');
            if ($id) {
                $value->parentNode->removeChild($value);
            }
        }

但是,当我要删除孩子时,它正在重新索引dom.假设我有8个项目我删除了第一个它将重新索引它,第二个元素将成为第一个它不会删除它将转到第二个现在是第三个元素.

解决方法:

这在DomNode::removeChild文档的一些注释中提到,问题显然是foreach上的迭代器指针无法处理在循环遍历子项列表时从父数组中删除项的事实(或者其他的东西).

建议的修复方法是首先遍历主节点,然后将要删除的子节点推送到自己的数组,然后循环遍历“待删除”数组并从父节点中删除这些子节点.例:

$dom = new DOMDocument();
@$dom->loadHTML($description);
$pTag = $dom->getElementsByTagName('p');

$spotid_children = array();

foreach ($pTag as $value) {
    /** @var DOMElement $value */
    $id = $value->getAttribute('data-spotid');
    if ($id) {
        $spotid_children[] = $value; 
    }
}

foreach ($spotid_children as $spotid_child) {
    $spotid_child->parentNode->removeChild($spotid_child); 
}

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...