Php解析了html表并且计数具体与另一个相似

时间:2012-05-04 17:22:24

标签: php html-table html-parsing

这个问题跟随另一个问题,刚刚解决了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'位置,只选择第五个位置,但我不知道是否可能。

2 个答案:

答案 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,并将其用作索引。