这个问题接著另一个,刚刚
在这里解决现在我想做一个不同的计数,更难弄清楚。
在我的解析 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"中的"否"和第二个"是">,反之亦然,都是"是"或两个"否"。
我想数一数 5 种中有多少"td"包含"否">
到目前为止,我通过循环浏览其他"td"来计算它们(请参阅顶部链接的我上一个问题的选定答案(并仅选择与目标字符串匹配的答案。
这是可以完成的,因为这些目标字符串在每行中只出现一次。
相反,在这种情况下,目标字符串("No"(对于每一行都不是唯一的,因为如上例所示,在同一"tr"中可以存在两次(在"td"4和5中(。
这样,我真的不知道如何为每行仅选择与目标字符串"No"匹配的第二 (5( 个"td",并从计数中排除 (4( "td"(可以匹配相同的字符串(。
显然,这两个"td"位于不同的列标题下,但这对区分它们没有用处。
我想过的唯一解决方案是从左边数"td"位置,只选择第 5 个,但我不知道这是否可能。
您确实必须更新某些部分。首先,您需要第 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
用于此目的,也可以将其用作索引。
从你上一个问题中获取代码,你应该已经有了这个:
$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++;
}
}