2012-05-04 19 views
0

這個問題接踵而來,正好解決了here
現在我想做一個不同的數,更難以弄清楚。

在我解析HTML表格,每行包含兩個非常相似,必然的, 'TD'(4號和5):PHP解析HTML表格和統計具體​​類似於另一

<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'-s(請參閱所選答案f或我上一個問題鏈接在頂部),並只選擇與目標字符串相匹配的問題。
這可以這樣做,因爲那些目標字符串在每行中只出現一次

在這種情況下,相反,目標串(「否」)不是爲每一行獨一無二的,因爲,如在上面的例子中,可以存在兩次(在「TD」 4 & 5)在同一'tr'。因此,我真的不知道如何爲每一行選擇第二個(5)'td',它與目標字符串「No」匹配,並排除(4)'td'(可以從計數中匹配相同的字符串)。

很顯然,這兩個'td'-s在不同的列標題下,但是這不能區分它們。

我想過的唯一的解決方案是從左側算起'td'的位置,並且只選擇第5個,但我不知道是否可能。

回答

0

你確實必須更新一些零件。首先你需要第四和第五個元素,所以你必須檢查(保留一個計數器或使用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,並將它用作索引。

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