2015-05-29 2 views
0

У меня есть простой html dom-запрос, который считывает информацию из источника футбольных украшений, а также загружаю также источник json.В: Как я могу объединить эти два цикла foreach

Вот мой полный код:

<?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:

Америка Copa America Boca Juniors
Европа Бундеслига Ганновер
Азия JLeague Нагоя

Я хотел бы объединить эти два результата в одном Еогеасп, и я хотел бы получить этот результат:

2014-12-23 20:00:00 2-1 Америка Копа Америка Бока Юниоры
2014-12-23 11:00:00 3-1 Европа Бундеслига Ганновер
2014-12-26 08:00:00 1-1 Азия JLeague Nagoya

Я надеюсь, что есть какой-то эксперт, который может помочь мне, потому что я пробовал много вариаций, но без результата. Я получил несколько советов (с кодом) от экспертов, но каждый раз возникали ошибки. С моим кодом нет ошибки, но мне нужно другое решение, потому что я хотел бы поставить все переменные в один foreach. Большое спасибо, я надеюсь, что кто-то может помочь мне с кодом, потому что я не на высоком уровне на php. Еще раз спасибо!

Я хотел бы поставить два foreach в один foreach, но я не хочу создавать новый массив, потому что мне не нужно.

+0

Что связывает два набора данных друг с другом? Значения связаны только с их индексами в каждом массиве (т. Е. Первый элемент в первом массиве идет с первым элементом второго массива, второй элемент идет со вторым элементом и т. Д.)? – showdev

+0

последовательность полностью та же, html-источник (это таблица с светильниками), строка 1 - пара первого элемента json, строка источника 2 html.является второй частью json. Я думаю, что только дата времени запуска анализируется из заголовка таблицы html. –

+0

Возможный дубликат [как объединить два массива с PHP?] (Http://stackoverflow.com/questions/7473851/how-do-i-concatenate-two-arrays-with-php) – showdev

ответ

0

Предполагая, что вы всегда будете иметь одинаковое количество элементов в каждом, и что они соответствуют 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"; 
    } 
} 

Поскольку у вас есть вложенный список первых и ничего связи два набора данных вместе, нет простого способа запуска одного цикла и получения данных от обоих. Легче подталкивать нужные данные в массив для каждого набора, а затем ходить по обоим массивам с помощью одного счетчика. caveat здесь состоит в том, что если у вас есть дополнительный элемент, вы получите отсутствующие результаты или ошибки.

+0

спасибо, мой друг! –

+0

Ваш код хорош, но я бы хотел использовать более поздние переменные в базе данных mysql, поэтому я думаю, что все значения (например, страна, конкуренция, клуб) в один массив не подходят для меня, потому что, как я могу добавить в mysql, если они присвоенный одному массиву –

+0

Или я должен добавить все переменные в уникальные массивы –

0

Сохраните ключи массивов 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(), следующий() ... Я написал первый пришел в виде