【问题标题】:Q: How can I combine these two foreach loop问:如何结合这两个 foreach 循环
【发布时间】:2015-08-12 14:43:43
【问题描述】:

我有一个简单的 html dom 查询,它从足球赛程源读取信息,我还加载了一个 json 源。

这是我的完整代码:

<?php
    header('Content-Type: text/html; charset=utf-8');
    ini_set("user_agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17");

include_once('simple_html_dom.php');

ini_set('display_errors', true);
error_reporting(E_ALL);

$str = file_get_contents('general.json');

$json = json_decode($str,true);

$filename = "source.html";
$html = file_get_html($filename);

class matches {
    var $day;
    var $kickofftime;
    var $result;

    function matches ($day, $kickofftime, $tip){
       $this->day=$day;
       $this->kickofftime=$kickofftime;
       $this->result=$result;
       return $this;
    }
}


$i=0;

$day=$html->find('h1',0);
$day->plaintext;
$day=str_replace("<h1>TODAY FOOTBALL FIXTURES: ","", $day);
$day=str_replace("</h1>","", $day);
$matchday = str_replace(array('MONDAY ', 'TUESDAY ', 'WEDNESDAY ', 'THURSDAY ', 'FRIDAY ',  'SATURDAY ',  'SUNDAY '), '', $day);
$matchday=str_replace(" ","-", $matchday);
$matchday=date('Y-m-d', strtotime($matchday));

foreach($html->find('table.fixtures') as $matches) 
{

    foreach ($matches->find('tr[class=a1],tr[class=a2]') as $matchesTR) {

        $kickofftime=$matchesTR->find('td[class=a11],td[class=a21]',0)->plaintext;
        $kodate = date('Y-m-d H:i:s', strtotime("$matchday $kickofftime +1 hour"));
        $result=$matchesTR->find('td');

        echo $kodate;
        echo $result[6]->plaintext.'<br>' ; 

        $i++;


    }
}

//Here is the 2nd foreach with the data of JSON source:

foreach($json as $key => $value) {

    $value = json_decode($value, true);
    echo $value["country"] . ", " . $value["competition"] . "  " . $value["club"] . "<br>";
}

// clean up memory
$html->clear();
unset($html);

?>

来自简单html dom html源码的当前结果:

2014-12-23 20:00:00 2-1
2014-12-23 11:00:00 3-1
2014-12-26 08:00:00 1-1

来自 JSON 源的结果:

美国美洲杯博卡青年队
欧洲德甲汉诺威
亚洲J联赛名古屋

我想将这两个结果合并到一个 foreach 中,我想得到这个结果:

2014-12-23 20:00:00 2-1 America Copa America Boca Juniors
2014-12-23 11:00:00 3-1 欧洲德甲汉诺威
2014-12-26 08:00:00 1-1 亚洲J联赛名古屋

我希望有一些专家可以帮助我,因为我尝试了很多变化但没有结果。我从专家那里得到了一些建议(带有代码),但每次都出现错误。使用我的代码没有错误,但我需要其他解决方案,因为我想将所有变量放在一个 foreach 中。非常感谢,我希望有人可以帮助我编写代码,因为我不是 php 的高级人员。再次感谢!

我想把两个foreach放到一个foreach中,但是我不想创建一个新数组,因为我不需要。

【问题讨论】:

  • 什么将两个数据集相互关联?值是否仅基于它们在每个数组中的索引相关(即第一个数组中的第一个元素与第二个数组的第一个元素一起,第二个元素与第二个元素一起等)?
  • 顺序完全一样,html源码(是一个带fixture的表格)第1行是json第一项的对,html源码第2行是json第二项的对。只是开球时间的日期是从html表的标题中解析出来的,我认为这很重要。
  • 是的,我看到有类似的问题,但是我不能使用数组映射,因为我不是高层
  • 而且我不需要将这两个数组放在一个数组中,我想将变量放在一个foreach循环中!

标签: php json loops foreach simple-html-dom


【解决方案1】:

假设您在每个项目中始终拥有相同数量的项目,并且它们匹配 1 到 1、2 到 2,您可以这样做:

$htmlDates = array();
$jsonLeag = array();

foreach($html->find('table.fixtures') as $matches) {
    foreach($matches->find('tr[class=a1],tr[class=a2]') as $matchesTR) {
        $kickofftime=$matchesTR->find('td[class=a11],td[class=a21]',0)->plaintext;
        $kodate = date('Y-m-d H:i:s', strtotime("$matchday $kickofftime +1 hour"));
        $result=$matchesTR->find('td');

        //echo $kodate;
        //echo $result[6]->plaintext.'<br>' ;
        $htmlDates[] = $kodates;
    }
}

//Here is the 2nd foreach with the data of JSON source:

foreach($json as $key => $value) {
    $value = json_decode($value, true);
    //echo $value["country"] . ", " . $value["competition"] . "  " . $value["club"] . "<br>";
    $jsonLeag[] = $value["country"] . ", " . $value["competition"] . "  " . $value["club"];
}

if(count($htmlDates) < count($jsonLeag)){
    for($i=0;$i<count($htmlData);$i++){
        echo $htmlData[$i] . " " . $jsonLeag[$i] . "<br />\r\n";
    }
} else {
    for($i=0;$i<count($jsonLeag);$i++){
        echo $htmlData[$i] . " " . $jsonLeag[$i] . "<br />\r\n";
    }
}

由于您首先拥有嵌套列表,并且没有任何东西将两个数据集联系在一起,因此没有简单的方法可以运行一个循环并从两者中获取数据。将您想要的数据推送到每个集合的数组中,然后使用一个计数器遍历两个数组会更容易。这里的警告是,如果有一个额外的元素,你会得到丢失的结果或错误。

【讨论】:

  • 您的代码很好,但我想稍后使用 mysql 数据库中的变量,所以我认为将所有值(如国家、竞争、俱乐部)分配到一个数组中对我不利,因为如何如果将它们分配给一个数组,我可以添加到 mysql
【解决方案2】:

保存 json 数组的键并在每个循环中使用下一个。

$json_keys = array_keys($json);
$i_key = 0;
foreach($html->find('table.fixtures') as $matches) 
{

    foreach ($matches->find('tr[class=a1],tr[class=a2]') as $matchesTR) {

        $kickofftime=$matchesTR->find('td[class=a11],td[class=a21]',0)->plaintext;
        $kodate = date('Y-m-d H:i:s', strtotime("$matchday $kickofftime +1 hour"));
        $result=$matchesTR->find('td');

        echo $kodate;
        echo $result[6]->plaintext.
        $value = json_decode($json[$json_keys[$i_key++]], true);
        echo $value["country"] . ", " . $value["competition"] . "  " . $value["club"] . "<br>";
        $i++;
    }
}

// clean up memory
$html->clear();
unset($html);

还有很多其他的变种——使用array_shift()、next()...我已经写了first come mind

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多