【问题标题】:Problem with parse table in PHP - array_combine(): Both parameters should have an equal number of elementsPHP中的解析表问题 - array_combine():两个参数应该有相同数量的元素
【发布时间】:2020-05-05 07:11:57
【问题描述】:

任务:按键从表中提取任意值。

一个表可以有任意数量的记录。

解决方法:我使用DOC,foreach将表格的html代码翻译成数据数组。

    <?php
  $text = '
  <html>
    <head></head>
    <body>
      <table>
        <tr>
          <th>Number</th>
          <th>ID-A</th>
          <th>ID-B</th>
          <th>TAG</th>
        </tr>
        <tr>
          <td>7</td>
          <td>481</td>
          <td>2</td>
          <td>ABCSDE</td>
        </tr>
        <tr>
          <td>2</td>
          <td>125</td>
          <td>1</td>
          <td>XDFE</td>
        </tr>
      </table>
    </body>
  </html>
  ';

  $domdoc = new DOMDocument();
  $domdoc->loadHTML($text);

  $thArray = $tdArray = $array = array();

  // Get 'th' array
  $th = $domdoc->getElementsByTagName('th');
  foreach ($th as $th) {
    $thArray[] = $th->nodeValue;
  }
  $count = count($thArray);
  //echo var_dump($thArray);

  // Get 'td' array
  $td = $domdoc->getElementsByTagName('td');
  $i = 0;
  foreach($td as $td) {
    if(count($tdArray[$i]) != $count) {
      $tdArray[$i][] = $td->nodeValue;
    } else {
      $i++;
      $tdArray[$i][] = $td->nodeValue;
    }
  }

  $transactionArray = array_combine($thArray, $tdArray);

  echo var_dump($transactionArray);

失败发生在数组 td 和 th 组合的阶段。 array_combine() 要求记录数等于表中的行数。如果记录数等于到 th 的单元格数,错误就会消失。

$transactionArray = array_combine($thArray, $tdArray);

在我的例子中,记录的数量可以向任何方向变化。

问题:在这种情况下如何合并数组?

【问题讨论】:

    标签: php


    【解决方案1】:

    您需要将标题值与$tdArray 的每一行结合起来。您可以在 foreach 循环中执行此操作:

    foreach ($tdArray as $td) {
        $transactionArray[] = array_combine($thArray, $td);
    }
    

    请注意,初始化 $tdArray = array(array()); 将删除您的代码从 foreach($td as $td) { 循环中获得的一些通知和警告错误。

    Demo on 3v4l.org

    【讨论】:

    • 尼克,谢谢!你真的帮了我大忙!
    • @АлексГарисон 别担心 - 看起来 Nigel 也给了你一个很好的解决方案......
    【解决方案2】:

    恕我直言,最好在每个 &lt;tr&gt; 行上查找 &lt;td&gt; 标签,这样您(可能)能够在进行过程中修复数据。

    所以想法是寻找每个&lt;tr&gt;,然后如果有&lt;td&gt; 元素,循环遍历它们。在这个阶段还要结合标题...

    $transactionArray = [];
    foreach ( $domdoc->getElementsByTagName('tr') as $tr )  {
        $data = $tr->getElementsByTagName('td');
        if ( count($data) > 0 ) {
            $tdArray = [];
            foreach( $data as $td) {
                $tdArray[] = $td->textContent;
            }
            $transactionArray[] = array_combine($thArray, $tdArray);
        }
    }
    

    【讨论】:

    • 哦!我喜欢有点深奥! +1(当您将代码插入我的演示时,代码也很有效:-)
    • @Nick - profundity 是锁定期间允许的:-/
    • 这可能是您仍然可以在保持社交距离的情况下做的少数几件事之一!
    • 在 PHP 7.2.0 - 7.4.5 中运行代码时一切正常。但是在 PHP 7.1 上运行时,我最初收到警告:“array_combine (): Both parameters should have a equal number of elements”。但代码有效。有什么办法可以隐藏错误吗?
    • 检查 $tdArray 的值是否与您希望加载的 HTML 相匹配,如果特定 tr 中的 td 少于标头。而不是抑制错误在组合之前添加$tdArray = array_pad($tdArray, $count, '' );
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    相关资源
    最近更新 更多