如何嵌套两个foreach以获得正确的值输出?

时间:2016-02-22 16:16:02

标签: php html web-scraping

我有两个foreach块来从网页中获取一些值(我正在从HTML表格中抓取值)。

<?php
include('../simple_html_dom.php');

$html = file_get_html('http://www.betexplorer.com/soccer/belgium/jupiler-league/results/');

foreach($html->find('td') as $e) {
    echo $e->innertext . '<br>';
}   

foreach( $html->find('td[data-odd]') as $td ) {
    echo $td->attr['data-odd'].PHP_EOL;
}
?>

这是我的HTML代码:

<tr class="strong">
    <td class="first-cell tl">
        <a href="../matchdetails.php?matchid=z7jbSp5K" onclick="win(this.href, 560, 500, 0, 1); return false;">Waasland-Beveren - Anderlecht</a>
    </td>
    <td class="result">
        <a href="../matchdetails.php?matchid=z7jbSp5K" onclick="win(this.href, 560, 500, 0, 1); return false;">1:0</a>
    </td>
    <td class="odds best-betrate" data-odd="5.97"></td>
    <td class="odds" data-odd="4.21"></td>
    <td class="odds" data-odd="1.51"></td>
    <td class="last-cell nobr date">21.02.2016</td>
</tr>
<tr class="">
    <td class="first-cell tl">
        <a href="../matchdetails.php?matchid=x0YB63r1" onclick="win(this.href, 560, 500, 0, 1); return false;">Waregem - KV Mechelen</a>
    </td>
    <td class="result">
        <a href="../matchdetails.php?matchid=x0YB63r1" onclick="win(this.href, 560, 500, 0, 1); return false;">2:3</a>
    </td>
    <td class="odds" data-odd="1.83"></td><td class="odds" data-odd="3.71"></td>
    <td class="odds best-betrate" data-odd="3.99"></td>
    <td class="last-cell nobr date">21.02.2016</td>
</tr>

这样,在我的输出中,我得到的是第一个foreach的值,之后是第二个的值。我想以正确的顺序一起获得价值。例如:

21.02.2016 Waasland-Beveren - Anderlecht 1:0 5.96 4.20 1.51   
21.02.2016 Waregem - KV Mechelen 2:3 1.83 3.71 3.98

1 个答案:

答案 0 :(得分:0)

如果他们有确切的(计数)或(长度)。将它们分配给两个变量后,请使用正常的for

$td = $html->find('td');
$attr = $html->find('td[data-odd]');

for($i=0; $i < count($td); $i++) 
     echo $td[$i]->innertext."<br/>".$attr[$i]->attr['data-odd'].PHP_EOL;

更新

您想重新排序从HTML文件中收到的tds,这意味着您必须考虑如何检索它们的另一个逻辑。此更新的代码非常适合您的情况:

$match_dates = $html->find("td[class=last-cell nobr date]"); // we have 1 per match
$titles = $html->find("td[class=first-cell tl]"); // 1 per match
$results = $html->find("td[class=result]"); // 1
$best_bets = $html->find("td[class=odds best-betrate]"); // 1
$odds = $html->find("td[class=odds]"); // 2

// Now to output everything in whatever order you want:

$c=0; $b=0; // two counters
foreach($titles as $match)
    echo $match_dates[$c]->innertext." - ".$match->innertext." [".$results[$c]->innertext."] - Best bet rate: ".$best_bets[$c++]->attr['data-odd']." - odds: ".$odds[$b++]->attr['data-odd'].", ".$odds[$b++]->attr['data-odd']."<br/>";