Добавить содержимое таблицы в массив с помощью DOMDocument

У меня $html:

$html = '
<table id = "myTable">
    <tbody>
        <tr>
            <td>08/20/18</td>
            <td> <a href = "https://example.com/1a">Text 1 A</a> </td>
            <td> <a href = "https://example.com/1b">Test 1 B</a> </td>
        </tr>
        <tr>
            <td>08/21/18</td>
            <td> <a href = "https://example.com/2a">Text 2 A</a> </td>
            <td> <a href = "https://example.com/2b">Test 2 B</a> </td>
        </tr>
    </tbody>
</table>
';

Используя DOMDocument, я хочу добавить содержимое таблицы в многомерный $array:

$array = array(
    // tr 1
    array(
        array(
            'content' => '08/20/18'
        ),
        array(
            'content' => 'Text 1 A',
            'href' => 'https://example.com/1a'
        ),
        array(
            'content' => 'Text 1 B',
            'href' => 'https://example.com/1b'
        )
    ),
    // tr 2
    array(
        array(
            'content' => '08/21/18'
        ),
        array(
            'content' => 'Text 2 A',
            'href' => 'https://example.com/1a'
        ),
        array(
            'content' => 'Text 2 B',
            'href' => 'https://example.com/1b'
        )
    )
);

Что я пробовал до сих пор

Мне удалось получить содержимое table с помощью xpath:

// setup DOMDocument
$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding = "utf-8" ?>' . $html); 
$xpath = new DOMXPath($doc);
// target table using xpath
$results = $xpath->query("//*[@id='myTable']");

if ($results->length > 0) {
    var_dump($results->item(0));
    var_dump($results->item(0)->nodeValue);
}

Попробуй это. Как можно поместить содержимое каждого tr в $array?

Прекрасный! Каждый вопрос на этом сайте должен иметь раздел что я пробовал до сих пор. +1

Gary Woods 21.08.2018 12:28

Я добавлю премию в 50 баллов, когда ответ на этот вопрос будет приемлемым.

Henrik Petterson 21.08.2018 13:05
Стоит ли изучать 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 и хотите разрабатывать...
3
2
231
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это выглядело интересно, поэтому я попробовал.

$dom = new DOMDocument;
$dom->loadHTML($html);
$multidimensional_array = [];
$i = 0;
$myTable = $dom->getElementById('myTable');
foreach ($myTable->getElementsByTagName('tr') as $tableRow) {
   foreach ($tableRow->getElementsByTagName('td') as $tableData) {

        foreach ($tableData->getElementsByTagName('a') as $a) {
            $href = ($a->getAttribute('href'));
        }

        if (isset($href) && !empty($href)){
            $multidimensional_array[$i][] = array(
                                                'content'   => $tableData->nodeValue,
                                                'href'      => $href
                                            );
            unset($href);
        }else{
            $multidimensional_array[$i][] = array(
                                                'content'   => $tableData->nodeValue
                                                );
        }

   }
   $i++;
}
print_r($multidimensional_array);

Надеюсь, это то, о чем спросили.

Обновлено: добавлен конкретный поиск по таблице перед циклами.

Интересный! Но можно ли настроить таргетинг на конкретную таблицу, аналогично тому, что я сделал для $xpath->query("//*[@id='myTable']");. Ваш подход нацелен на все tr и td. знак равно

Henrik Petterson 21.08.2018 13:30

Вы можете получить конкретную таблицу, выполнив поиск по ее идентификатору. Добавил это в свой ответ.

yasoh 21.08.2018 13:57
Ответ принят как подходящий
<?php

$html = '
<table id = "myTable">
    <tbody>
        <tr>
            <td>08/20/18</td>
            <td> <a href = "https://example.com/1a">Text 1 A</a> </td>
            <td> <a href = "https://example.com/1b">Test 1 B</a> </td>
        </tr>
        <tr>
            <td>08/21/18</td>
            <td> <a href = "https://example.com/2a">Text 2 A</a> </td>
            <td> <a href = "https://example.com/2b">Test 2 B</a> </td>
        </tr>
    </tbody>
</table>
';

$data = [];

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding = "utf-8" ?>' . $html);
$xpath = new DOMXPath($doc);
$trs = $xpath->query("//*[@id='myTable']/tbody/tr");
foreach ($trs as $i => $tr) {
    /** @var DOMElement $td */
    foreach ($tr->childNodes as $td) {
        if ($td instanceof DOMElement) {
            /** @var DOMElement $a */
            $row = [];
            foreach ($td->childNodes as $a) {
                /** @var DOMAttr $attribute */
                $row['content'] = $td->nodeValue;
                if ($a->hasAttributes()) {
                    foreach ($a->attributes as $attribute) {
                        $row[$attribute->name] = $attribute->value;
                    }

                }

            }
            $data[$i][] = $row;
        }
    }
}

var_dump($data);

Спасибо! Я тестирую это, но выдает предупреждения, см. это.

Henrik Petterson 21.08.2018 13:42

посмотрите модифицированную версию

cetver 21.08.2018 13:51

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