0

这个问题紧随其后,刚刚在这里
解决了 现在我想做一个不同的计数,更难弄清楚。

在我解析的 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”,第二个'td'中的字符串可以是“Yes”,反之亦然,两者都是“Yes”或两者都是“No”。

我想计算 5 种中有多少 'td' 包含“否”

到现在,我通过循环计算其他 'td'-s(请参阅顶部链接的上一个问题的选定答案)并仅选择匹配目标字符串的。
可以这样做是因为这些目标字符串在每一行中只出现一次

在这种情况下,相反,目标字符串("No")对于每一行不是唯一的,因为如上例所示,在同一个 'tr' 中可能存在两次(在 'td' 4 和 5 中)。

那样的话,我真的不知道如何只为每一行选择第二个 (5) 'td',它与目标字符串 "No" 匹配,并排除 (4) 'td'

显然,这两个 'td'-s 在不同的列标题下,但这对区分它们没有用处。

我想到的唯一解决方案是从左边数“td”位置,并只选择第 5 个,但我不知道这是否可能。

4

2 回答 2

0

Taking the code from your previous question, you should already have this:

$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;
        }
    }
}

Since you're already going through the td's, it would be quite simple to do what you said - "count the 'td' position from left, and to select only the 5th". As long as you know that it is definitely the fifth td you can do:

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++;
    }
}
于 2012-05-04T17:34:47.237 回答
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很容易地使用它,也可以将它用作索引。

于 2012-05-04T17:41:23.383 回答