Как получить таблицу html в массиве правильных совпадений? - PullRequest
0 голосов
/ 20 февраля 2020

В настоящее время я могу получить массив с помощью синтаксического анализатора DOM в PHP, но может ли кто-нибудь из 1 научить меня, как это сделать?

Вот мое кодирование для получения данных таблицы html.

<?php
$DOM = new DOMDocument();
$DOM->loadHTML($htmlContent);

$Header = $DOM->getElementsByTagName('th');

//#Get header name of the table
foreach ($Header as $NodeHeader) {  
    $Header=$NodeHeader->c14n();
    $thDom= new DOMDocument();
    $thDom->loadHtml($Header);
    $aDataTableHeaderHtml[] = $NodeHeader->textContent;
}
print_r($aDataTableHeaderHtml);

$datacell = [];
$trs = $DOM->getElementsByTagName('tr'); //Get table row
foreach ($trs as $tr) {
    $trHtml = $tr->c14n();
    $trDom = new DOMDocument();
    $trDom->loadHTML($trHtml);
    $td = $trDom->getElementsByTagName('td'); //Get table data
    $array = [];
    foreach ($td as $cells) {
        $array[] = $cells->textContent;
    }
    $datacell[] = $array;
}
print_r($datacell);

Это формат таблицы html, который я получил с веб-сайта. Ниже несколько строк, но я просто показываю часть из них.

<table class="Stats-table">
  <tr class='TblHdr'>
    <th><b></b></td>
      <th><b>USD</b></th>
      <th><b>GBP</b></th>
      <th><b>EUR</b></th>
      <th><b>JPY100</b></th>
      <th><b>CHF</b></th>
      <th><b>AUD</b></th>
      <th><b>CAD</b></th>
      <th><b>SGD</b></th>
      <th><b>HKD100</b></th>
  </tr>
  <tr>
    <td>3/2/2020</td>
    <td>4.1155</td>
    <td>5.4152</td>
    <td>4.5606</td>
    <td>3.7915</td>
    <td>4.2694</td>
    <td>2.7547</td>
    <td>3.1079</td>
    <td>3.0082</td>
    <td>52.9935</td>
  </tr>
  <tr>
    <td>4/2/2020</td>
    <td>4.1170</td>
    <td>5.3521</td>
    <td>4.5524</td>
    <td>3.7877</td>
    <td>4.2582</td>
    <td>2.7644</td>
    <td>3.0976</td>
    <td>3.0031</td>
    <td>52.9903</td>
  </tr>
  <tr>

Ниже приведен результат, полученный от анализатора DOM. Этот массив является результатом получения заголовка таблицы.

Array
(
    [0] => 

    [1] => USD
    [2] => GBP
    [3] => EUR
    [4] => JPY100
    [5] => CHF
    [6] => AUD
    [7] => CAD
    [8] => SGD
    [9] => HKD100
    [10] => 
    [11] => THB100
    [12] => PHP100
    [13] => TWD100
    [14] => KRW100
    [15] => IDR100
    [16] => SAR100
    [17] => SDR
    [18] => CNY
    [19] => BND
    [20] => 
    [21] => VND100
    [22] => KHR100
    [23] => NZD
    [24] => MMK100
    [25] => INR100
    [26] => AED100
    [27] => PKR100
    [28] => NPR100
    [29] => EGP
) 

Массив ниже показывает данные строк.

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
            [0] => 3/2/2020
            [1] => 4.1155
            [2] => 5.4152
            [3] => 4.5606
            [4] => 3.7915
            [5] => 4.2694
            [6] => 2.7547
            [7] => 3.1079
            [8] => 3.0082
            [9] => 52.9935
        )

    [2] => Array
        (
            [0] => 4/2/2020
            [1] => 4.1170
            [2] => 5.3521
            [3] => 4.5524
            [4] => 3.7877
            [5] => 4.2582
            [6] => 2.7644
            [7] => 3.0976
            [8] => 3.0031
            [9] => 52.9903
        )

    [3] => Array
        (
            [0] => 5/2/2020
            [1] => 4.1210
            [2] => 5.3668
            [3] => 4.5471
            [4] => 3.7654
            [5] => 4.2504
            [6] => 2.7767
            [7] => 3.1006
            [8] => 2.9849
            [9] => 53.0670
        )

Я хочу, чтобы массив совпадал с правильным 1 .

Пример:

Array
(
    [] => 3/2/2020
    [USD] => 4.1155
    [GBP] => 5.4152
    [EUR] => 4.5606
    [JPY100] => 3.7915
    [CHF] => 4.2694
    [AUD] => 2.7547
    [CAD] => 3.1079
    [SGD] => 3.0082
    [KHKD100] => 52.9935
)

1 Ответ

0 голосов
/ 20 февраля 2020

array_combine построит массив из двух массивов. Первый используется для ключей, а второй для значений.

$combined = array_combine($aDataTableHeaderHtml, $datacell[1]);
print_r($combined);

Вывод:

Array
(
    [
      ] => 3/2/2020
    [USD] => 4.1155
    [GBP] => 5.4152
    [EUR] => 4.5606
    [JPY100] => 3.7915
    [CHF] => 4.2694
    [AUD] => 2.7547
    [CAD] => 3.1079
    [SGD] => 3.0082
    [HKD100] => 52.9935
)

У вас есть некоторые проблемы с пробелами, я бы предложил использовать trim на ваши значения, прежде чем вывести их в массив. Кроме того, нет необходимости l oop поверх <tr> элементов. Просто получите доступ к элементам <td> напрямую, так же, как и к элементам <th>.

...