Зачистка файла для преобразования в json - PullRequest
0 голосов
/ 27 сентября 2019

Я не получаю вывод от нижней половины, как я ожидал.Я могу получить данные верхней таблицы, но я также пытаюсь получить данные нижней таблицы и поместить их в json.Столбцы, которые мне нужно взять:

1.Неделя Дата Дома В гостях В Примечаниях

<code><?php

libxml_use_internal_errors(true);

$doc = new DOMDocument();
$doc->loadHTML(file_get_contents('https://www.leagueleader.net/sharedreport.php?operatorid=98&code=bc155b01-7492-412d-aa75-3c1e357248f1'));
$doc->strictErrorChecking = false;

$pre = [];
$keys = ['team', 'div', 'team-site-name', 'site-address', 'site-phone'];
$keys2 = ['week', 'date', 'home', 'away', 'at', 'notes'];
foreach ($doc->getElementsByTagName('table') as $k => $table) {

    if (strpos($table->getAttribute('class'), 'report') === false) {
        continue;
    }
    foreach ($table->getElementsByTagName('tr') as $i => $tr) {
        if ($tr->parentNode->nodeName === 'thead') continue; // skip headers 
        $row_values = [];
        foreach ($tr->childNodes as $td) {
            $text = trim($td->nodeValue);
            if ($text === '') continue;
            $row_values[] = $text;
        }

        if($k == 1 ){


            $row_values = array_combine($keys, $row_values);

        }else   if($k == 2 ){
            unset($row_values[1]);
        $row_values = array_combine($keys2, $row_values);

        }
          $pre[$row_values['name']][] = $row_values;

    }

}
$combined = [];
foreach($pre as $week => $row){
    $combined[$name] = [
        "week"=> $week,
        "team"=> $row[0]['team'],
        "div"=> $row[0]['div'],
        "team-site-name" => $row[0]['team-site-name'],
        "site-address" => $row[0]['site-address'],
        "site-phone" => $row[0]['site-phone'],

        //"week" => $row[1]['week'],
        "date" => $row[1]['date'],
        "home" => $row[1]['home'],
        "away" => $row[1]['away'],
        "at" => $row[1]['at'],
        "notes" => $row[1]['notes']
    ];
}

echo '<pre>'.json_encode($combined, JSON_PRETTY_PRINT).'
';?>

Вот вывод

{  
    "": {  
        "week": "",  
        "team": "1",  
        "div": "A",  
        "team-site-name": "Team 01Freer Bar",  
        "site-address": "\u00a07355 Michigan Ave Detroit, MI 48210",  
        "site-phone": "\u00a03138993699",  
        "date": null,  
        "home": null,  
        "away": null,  
        "at": null,  
        "notes": null  
    }  
}  

1 Ответ

1 голос
/ 27 сентября 2019

Чтобы получить данные из второй таблицы совпадений, я изменил обработку для использования XPath.Это извлекает теги <tr> из тела второй таблицы с помощью class='report' (используя //table[@class='report'][2]/tbody/tr).

Таким образом, будут возвращены все строки в теле таблицы.Затем извлеките все элементы <td> и выберите детали в строке.Если есть неделя / дата, она просто перезаписывает текущие данные, если есть сведения о совпадении, она создает строку на выходе ...

$xpath = new DOMXPath($doc);
$reportRow = $xpath->query("//table[@class='report'][2]/tbody/tr");
$matches = [];
$week = '';
$date = '';
foreach ($reportRow as $row) {
    $cells = $row->getElementsByTagName("td");
    // Set week and date if present in the current row
    $week = trim($cells[0]->textContent)?:$week;
    $date = trim($cells[1]->textContent)?:$date;
    // Extract the other details
    $teamHome = trim($cells[2]->textContent);
    $teamAway = trim($cells[3]->textContent);
    $at = trim($cells[4]->textContent);
    $notes = trim($cells[5]->textContent);

    // If there are some match details, the store them
    if ( !empty($teamHome) )    {
        $matches[] = ["week" => $week, "date" => $date,
            "teamHome" =>$teamHome, "teamAway" =>$teamAway,
            "at" => $at, "notes" => $notes
        ];
    }
}
print_r($matches);

Это дает ...

Array
(
    [0] => Array
        (
            [week] => 1
            [date] => 09/10/2019
            [teamHome] => Team 01
            [teamAway] => BYE
            [at] => BYE
            [notes] => 
        )
...