DOMDocument - вложенные циклы for для создания X HTML, приводит к неправильной итерации числа - PullRequest
0 голосов
/ 30 апреля 2020

Используя PHP DOMDocument, я создаю таблицу, которая должна принимать входные данные из массива данных. Код работает нормально, ожидая, что введенный ряд данных (массив) неверен в результате. Код структурирован для получения X HTML в соответствии с определенной спецификацией, поэтому я не могу изменять способ, которым код таблицы выглядит в конечном файле X HTML.

Причина, по которой я использую Циклы for - это то, что количество ячеек таблицы может растянуться до 80 ячеек, поэтому необходимо уменьшить базовую кодовую область.

Наблюдение [1]:

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

Наблюдение [2]:

2 цикла for имеют разное количество итераций, поскольку первым необходимо выполнить итерацию по трем заголовкам в массиве, в то время как последнему l oop необходимо выполнить итерацию 2 раза, чтобы заполнить ячейки для period-0 / balance-0 и period- 1 / баланс-1. Может ли это быть проблемой, если число итераций во вложенных циклах for не совпадает?

Вопрос:

Как исправить код так, чтобы число серия представляется как «требуемый результат»?

Результат - содержимое таблицы (из браузера):

Cash    1   2
Bank    1   2
Credit  1   2

требуемый результат - содержимое таблицы (в браузере) ):

Cash    1   2
Bank    3   4
Credit  5   6

Мой код:

<?php

$data = [
  'titles' => ['Cash', 'Bank', 'Credit'],
  'period' => [
  [1,3,5], // Period [0]
  [2,4,6], // Period [1]
  ],
];

// Create new document
$xml = new DomDocument('1.0', 'UTF-8');
$xml->formatOutput = true;

// Build Base document

$html = $xml->createElement('html', ' ');
$html->setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
$html->setAttribute('xmlns:ix', 'http://www.xbrl.org/2013/inlineXBRL');
$xml->appendChild($html);

$head = $xml->createElement('head', ' ');
$html->appendChild($head);

$style = $xml->createElement('style');
$style->nodeValue = 'table, th, td {border: 1px solid black;}';
$head->appendChild($style);

$body = $xml->createElement('body', ' ');
$html->appendChild($body);

// Build Table

$table = $xml->createElement('table', ' ');
$body->appendChild($table);

$colgroup = $xml->createElement('colgroup', ' ');
$table->appendChild($colgroup);

$thead = $xml->createElement('thead', ' ');
$table->appendChild($thead);

$tbody = $xml->createElement('tbody', ' ');
$thead->appendChild($tbody);

/**
 * ---------------------------------------
 * Row constructor
 * ---------------------------------------
 */

for ($i=0; $i <= 2 ; $i++) {

  // Titles

  $tr = $xml->createElement('tr', ' ');
  $tr->setAttribute('class', 'sep');
  $tbody->appendChild($tr);

  $td = $xml->createElement('td');
  $td->nodeValue = $data['titles'][$i]; // Injecting data from array.
  $tr->appendChild($td);

  for ($x=0; $x <= 1 ; $x++) {

    // Values

    $td = $xml->createElement('td', ' ');
    $tr->appendChild($td);

    $span = $xml->createElement('span', ' ');
    $span->setAttribute('class', 'sum');
    $td->appendChild($span);

    $ix_non_fraction = $xml->createElement('ix:nonFraction');
    $ix_non_fraction->nodeValue = $data['period'][$x][0];  // Injecting data from array.
    $ix_non_fraction->setAttribute('contextRef', ('balance' . $x));
    $span->appendChild($ix_non_fraction);

  }

}

// Save & Print

$xml->save("1_result.xhtml");
$xml->save("2_result.xml");
echo $xml->saveXML();

Результат (X HTML):

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ix="http://www.xbrl.org/2013/inlineXBRL">
  <head>
    <style>
      table,
      td,
      th {
        border: 1px solid black;
      }
    </style>
  </head>
  <body>
    <table>
      <colgroup></colgroup>
      <thead>
        <tbody>
          <tr class="sep">
            <td>Cash</td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance0">1</ix:nonFraction>
              </span>
            </td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance1">2</ix:nonFraction>
              </span>
            </td>
          </tr>
          <tr class="sep">
            <td>Bank</td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance0">1</ix:nonFraction>
              </span>
            </td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance1">2</ix:nonFraction>
              </span>
            </td>
          </tr>
          <tr class="sep">
            <td>Credit</td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance0">1</ix:nonFraction>
              </span>
            </td>
            <td>
              <span class="sum">
                <ix:nonFraction contextRef="balance1">2</ix:nonFraction>
              </span>
            </td>
          </tr>
        </tbody>
      </thead>
    </table>
  </body>
</html>
...