Проблема с циклом Xpath для анализа простой таблицы HTML в массив php

Итак, мой предыдущий вопрос: PHP Преобразование html-таблицы в JSON был быстро отклонен как дубликат, и я все еще изо всех сил пытаюсь получить то, что мне нужно. Я думаю, что это в основном логическая проблема в циклах, и мне нужен кто-то еще, чтобы взглянуть на нее.

В качестве примера приведена эта таблица:

<table id = "Details" class = "DATA_TABLE DATA_TABLE_WO_TOTAL">
  <tr>
    <th>Application</th>
    <th>Version number</th>
    <th>Virtual Administration Server</th>
    <th>Group</th>
    <th>Device</th>
    <th>Installed</th>
    <th>Last visible time</th>
    <th>Last connection to Administration Server</th>
    <th>IP address</th>
  </tr>
  <tr>
    <td class = "sD">some text</td>
    <td class = "sD">10.2.5.3201</td>
    <td class = "sD"></td>
    <td class = "sD">Thin PC</td>
    <td class = "sD">PC#</td>
    <td class = "sD">date</td>
    <td class = "sD">date</td>
    <td class = "sD">date</td>
    <td class = "sD">ip address</td>
  </tr>
  <tr>
     <tr>
    <td class = "sD">some more text</td>
    <td class = "sD">10.2.5.3201</td>
    <td class = "sD"></td>
    <td class = "sD">Thin PC</td>
    <td class = "sD">PC#</td>
    <td class = "sD">date</td>
    <td class = "sD">date</td>
    <td class = "sD">date</td>
    <td class = "sD">ip address</td>
  </tr>
</table>

Мне нужно создать массив (который я позже могу преобразовать в json), где теги th — это ключи, а затем все теги td внутри друг друга tr — это данные, соответствующие этим ключам. У меня есть следующий php-код:

<?php
$dom = new DOMDocument;
$dom->loadHTML($cleantable2); //this is the table above
$xpath = new DOMXPath($dom);

foreach($xpath->query('//table/tr') as $tr){
        $tmp = [];
                foreach($xpath->query('//table/tr/th', $tr) as $th){
                        $key = $th->textContent;
                        foreach($xpath->query('td', $tr) as $td){
                                $tmp[$key] = trim($td->textContent);
                        }
                }
                $result[]=$tmp;
        }
var_dump($result);

?>

Он правильно получает ключи, но не данные, пример вывода:

  [89]=>
  array(9) {
    ["Application"]=>
    string(13) "192.168.6.104"
    ["Version number"]=>
    string(13) "192.168.6.104"
    ["Virtual Administration Server"]=>
    string(13) "192.168.6.104"
    ["Group"]=>
    string(13) "192.168.6.104"
    ["Device"]=>
    string(13) "192.168.6.104"
    ["Installed"]=>
    string(13) "192.168.6.104"
    ["Last visible time"]=>
    string(13) "192.168.6.104"
    ["Last connection to Administration Server"]=>
    string(13) "192.168.6.104"
    ["IP address"]=>
    string(13) "192.168.6.104"
  }

Как видите, он получает только IP-адрес для каждого ключа, а не остальные данные. Что я делаю неправильно? Может ли кто-нибудь помочь, а не просто отклонить это как дубликат? Я пытался понять это больше дня, я почти уверен, что моя проблема просто не зацикливается правильно, но я этого не вижу...

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
$strhtml='
<table id = "Details" class = "DATA_TABLE DATA_TABLE_WO_TOTAL">
  <tr>
    <th>Application</th>
    <th>Version number</th>
    <th>Virtual Administration Server</th>
    <th>Group</th>
    <th>Device</th>
    <th>Installed</th>
    <th>Last visible time</th>
    <th>Last connection to Administration Server</th>
    <th>IP address</th>
  </tr>
  <tr>
    <td class = "sD">some text</td>
    <td class = "sD">10.2.5.202</td>
    <td class = "sD">Plato</td>
    <td class = "sD">Thin PC</td>
    <td class = "sD">PC#</td>
    <td class = "sD">date a</td>
    <td class = "sD">date b</td>
    <td class = "sD">date c</td>
    <td class = "sD">10.25.100.1</td>
  </tr>
  <tr>
     <tr>
    <td class = "sD">some more text</td>
    <td class = "sD">10.2.5.321</td>
    <td class = "sD">Socrates</td>
    <td class = "sD">Thick PC</td>
    <td class = "sD">PC#</td>
    <td class = "sD">date x</td>
    <td class = "sD">date y</td>
    <td class = "sD">date z</td>
    <td class = "sD">10.25.100.2</td>
  </tr>
</table>';

Учитывая приведенный выше фрагмент html, возможно, вам нужно следующее? Комментарии должны помочь увидеть, что я сделал

libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->loadHTML( $strhtml );
libxml_clear_errors();

$xp=new DOMXPath( $dom );
/* find the `th` elements */
$col = $xp->query( '//tr/th' );

/* temp arrays */
$tmp=$out=$keys=array();


if ( $col->length > 0 ){
    /* get all headers as keys */
    foreach( $col as $node )$keys[]=$node->nodeValue;

    /* get all table cell data - store in single array */
    $col=$xp->query( '//tr/td[ @class = "sD" ]' );
    foreach( $col as $node )$tmp[]=$node->nodeValue;

    /* split data into chunks according to number of columns */
    $rows=array_chunk( $tmp, count( $keys ) );

    /* combine keys and chunks */
    foreach( $rows as $row ){
        $tmp=array();
        foreach( $row as $i => $value ) $tmp[ $keys[ $i ] ]=$value;
        $out[]=$tmp;
    }

    echo json_encode( $out );
}

вывод:

[
    {
        "Application":"some text",
        "Version number":"10.2.5.202",
        "Virtual Administration Server":"Plato",
        "Group":"Thin PC",
        "Device":"PC#",
        "Installed":"date a",
        "Last visible time":"date b",
        "Last connection to Administration Server":"date c",
        "IP address":"10.25.100.1"
    },
    {
        "Application":"some more text",
        "Version number":"10.2.5.321",
        "Virtual Administration Server":"Socrates",
        "Group":"Thick PC","Device":"PC#",
        "Installed":"date x",
        "Last visible time":"date y",
        "Last connection to Administration Server":"date z",
        "IP address":"10.25.100.2"
    }
]

Большое спасибо, именно то, что мне нужно было сделать!!

sn00py 27.02.2019 10:04

Другие вопросы по теме