有一个代码php
。我在帮助下DOMDocument
搜索所有标签,img
然后遍历它们并进行更改。
问题是html
我正在使用的那个有 5 个标签img
。并且循环经过3次。
可能是什么问题呢?
$dom = new DOMDocument();
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$imgs_t = $dom->getElementsByTagName('img');
$amp_img_src = '/images/front/what_is_dt_video.jpg';
$count_foreach = 0;
foreach( $imgs_t as $img_t ){
$count_foreach++;
$img_alt = '';
$tmp_img_src = $img_t->getAttribute('src');
$img_alt = $img_t->getAttribute('alt');
if($tmp_img_src != $amp_img_src){
$tmp_amp_img = $dom->createElement('amp-img');
$tmp_amp_img->setAttribute('width', 200);
$tmp_amp_img->setAttribute('height', 200);
$tmp_amp_img->setAttribute('src', $tmp_img_src);
$tmp_amp_img->setAttribute('alt', $img_alt);
$img_t->parentNode->replaceChild($tmp_amp_img, $img_t);
}
}
var_dump($count_foreach);
这正是代码开头html
变量中包含的那个。$html
php
<div class="what_is_dt drop_down_pg">
<div class="drop_down_video drop_down_cont">
<div class="col-sm-7 col-xs-12">
<div class="video_wrap">
<div id="ntx_dt_info_video_link" class="no-padding">
<img src="/images/front/what_is_dt_video.jpg" height="315px" width="481px" alt="Lorem ipsum">
</div>
<div class="what_fx_video_head">
<span>Lorem ipsum</span>
</div>
</div>
</div>
<div class="col-sm-5 col-xs-12 no-padding">
<span class="background_green">
<h2>Lorem ipsum</h2>
<p><em>Lorem ipsum</em></p>
<p><em>Lorem ipsum</em></p>
</span>
[T]CONFIRM_THEORY[/T]
</div>
[T]CONFIRM_THEORY_MOBILE[/T]
<hr />
</div>
<h2 style="margin-top: 40px;"><strong>Lorem ipsum</strong></h2>
<div style="padding-top: 30px;">
<div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
<img src="/uploads/docs/th%20Failure%20Swing.png" alt="Lorem ipsum" title="Lorem ipsum" width="200" height="200" />
<span style="font-size: small;"> <strong>Lorem ipsum.</strong></span>
<span style="font-size: small;">Lorem ipsum. </span>
</div>
<div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
<img src="/uploads/docs/th%20Nonfailure%20Swing.png" alt="Lorem ipsum" width="200" height="200"/>
<span style="font-size: small;"><strong>Lorem ipsum.</strong> </span>
<span style="font-size: small;">Lorem ipsum.</span>
</div>
</div>
<p style="clear: both; padding-top: 30px;" >Lorem ipsum.</p>
<div style="padding-top: 30px;">
<div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
<img src="/uploads/docs/th Failure Swing Bottom.png" alt="" />
<p><span style="font-size: small;"><strong>Failure Swing </strong>Lorem ipsum.</span></p>
</div>
<div class="signature-left col-lg-6 col-md-6 col-sm-6 col-xs-12">
<img src="/uploads/docs/th Nonfailure Swing Bottom.png" alt="Lorem ipsum" width="200" height="200" />
<p><span style="font-size: small;"><strong>Nonfailure Swing</strong>Lorem ipsum.</span></p>
</div>
</div>
<p style="clear: both;"><br /></p>
[T]OUR_LEARNING[/T]
</div>
一般来说,如果简化为最小示例,问题看起来像这样。
这里发生了什么。你找到所有 5 个元素。你开始扫荡。在第一次迭代中,满足条件并替换第一个节点。那么应该有一个过渡到原来集合的第二个节点,但是我们已经改变了它,现在改变集合的第二个节点将对应到原来的第三个节点。因此,原始节点的第二个节点可以说是丢失了。我无法完全解释如何以及什么中断,但问题是关于迭代器的实现。
通常,如果您以相反的顺序浏览此集合,则可以更改结构。这里,原则上,这样一个循环删除数组元素的经典问题,如果你delete,按相反的顺序处理,那么删除节点不会影响对尚未处理的元素数组的索引
如果我们想象我们的收藏是
执行第一次迭代。迭代器索引
0
,元素А
。我们删除这个元素,集合变成我们继续进行新的迭代,迭代器计数器一无所知,并且增加了
1
. 提取此元素并获得C
. 结果,我们得到,由于第一个元素的删除(替换),我们丢失了元素B
。如果以相反的顺序处理集合,则不会出现此问题。