Php解析的html表和计数具体<td>类似于另一个



这个问题接著另一个,刚刚
在这里解决现在我想做一个不同的计数,更难弄清楚。

在我的解析 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++;
    }
}

相关内容

最新更新