这个问题跟随另一个问题,刚刚解决了here
现在我想做一个不同的计数,更难以弄明白。
在我解析的HTML表格中,每行包含两个非常相似且相应的“td”(数字4和5 ):
<tr>
(1) <td class="tdClass" ....</td>
(2) <td class="tdClass" ....</td>
(3) <td class="tdClass" ....</td>
(4) <td class="tdClass" align="center" nowrap="">No</td>
(5) <td class="tdClass" align="center" nowrap="">No</td>
</tr>
第一个'td'中的字符串可能是“No”,第二个中的字符串可能是“Yes”,反之亦然,“Yes”或“No”都是。
我想知道5种中有多少'td'包含“否”
到现在为止,我通过循环来计算其他'td'-s(参见我在上面链接的上一个问题的选定答案)并仅选择与目标字符串匹配的答案。
这可以完成,因为这些目标字符串每行只出现一次。
在这种情况下,而目标字符串(“否”)对于每一行都不是唯一的,因为,如上例所示,可以在同一'tr'中存在两次(在'td'4&amp; 5中)。
由此,我真的不知道如何为每一行选择第二个(5)'td',它与目标字符串“No”匹配,并排除(4)'td'(可能与之匹配)字符串)来自计数。
显然,这两个'td'是在不同的列标题下,但这对于区分它们是没有用的。
我想到的唯一解决方案是从左边开始计算'td'位置,只选择第五个位置,但我不知道是否可能。
答案 0 :(得分:0)
从上一个问题中获取代码,您应该已经拥有:
$targetString = 'TARGET STRING';
$rows = $table->find('.trClass');
$count = 0;
foreach($rows as $row) {
foreach($row->find('td') as $td) {
if ($td->innertext === $targetString) {
$count++;
break;
}
}
}
由于你已经完成了td,所以做你所说的很简单 - “从左边算上'td'位置,只选择第5个”。只要你知道它绝对是你可以做的第五个td:
foreach($rows as $row) {
$tdcount = 0;
foreach($row->find('td') as $td) {
//...
//Bear in mind the first td will have tdcount=0, second tdcount=1 etc. so fifth:
if($tdcount === 4 && ( 'Yes'===$td->innertext || 'No'===$td->innertext) ) {
//do whatever you want with this td
}
$tdcount++;
}
}
答案 1 :(得分:0)
您确实需要更新某些部分。首先,你需要第4和第5个元素,所以你必须检查它(保持计数器或使用for循环)。其次,在这种情况下你不需要休息,因为它会停止循环。
代码:
<?php
$targetString = 'No';
$rows = $table->find('.trClass');
$count = 0;
foreach($rows as $row) {
$tds = $row->find('td');
for (i = 0; i < count($tds); $i++) {
// Check for the 4th and 5th element
if (($i === 3 || $i === 4) && $tds[$i]->innertext === $targetString) {
$count++;
}
}
}
这里我使用for循环而不是foreach循环,因为我不想手动保持计数器。我可以轻松地使用$i
,并将其用作索引。