【问题标题】:Print mysqli result in a formatted html table在格式化的 html 表中打印 mysqli 结果
【发布时间】:2017-05-11 04:27:00
【问题描述】:

我有一个返回以下结果的 mysqli 查询:

+--------+------+-----------+---------+-------+----------+
| Agent  | Date | operation | article |  num  | quantity |
+--------+------+-----------+---------+-------+----------+
| Albert | D1   | SL1       | A       |  0001 |      300 |
| Albert | D1   | SL1       | A       |  0002 |      400 |
| Albert | D3   | SL2       | B       | 00046 |      100 |
| Robert | D3   | SL4       | A       |  1231 |      400 |
| Robert | D3   | SL5       | C       |   888 |       20 |
| Robert | D2   | SL3       | B       |  9999 |       90 |
+--------+------+-----------+---------+-------+----------+

查询以AGENT ASC, DATE ASC, Operation ASC, ARTCLE ASC排序

我试图通过以下方式在格式化的 HTML 表格中打印结果

Agent: ALBERT
     DATE : D1
       Operation: SL1
          ARTICLE : A
             num: 0001 | Quantity: 300
             num: 0002 | Quantity: 400
     DATE : D3
       Operation: SL2
          ARTICLE : B
             num: 00046 | Quantity:100
Agent: Robert
     DATE: D3
       Operation: SL4
          ARTICLE : A
             num: 1231  | Quantity: 400
       Operation: SL5
          ARTICLE : C
             num: 888  | Quantity: 20
     DATE: DX
       Operation: SL3
          ARTICLE : B
             num: 9999  | Quantity: 90

我试过这样做,但没有成功:

$prevAgent="";
$prevDate="";
$prevOperation="";
$prevArticle="";
$prevNum="";
while ($row = mysqli_fetch_array($result)) {
     if ($row['Agent']!= $prevAgent) {
                   echo "<tr><td>".$row['Agent']."</td><td></td><td></td><td></td><td></td><td></td></tr>";
                                }
     if ($row['date']!= $prevDate) {
                   echo "<tr><td></td><td>".$row['date']."</td><td></td><td></td><td></td><td></td></tr>";
                                }
     if ($row['Operation']!= $prevOperation) {
                   echo "<tr><td></td><td></td><td>".$row['Operation']."</td><td></td><td></td><td></td></tr>";
                                }
     if ($row['Article']!= $prevArticle) {
                   echo "<tr><td></td><td></td><td></td><td>".$row['Article']."</td><td></td><td></td></tr>";
                                }
       if ($row['Num']!= $prevNum) {
                  echo "<tr><td></td><td></td><td></td><td></td><td>".$row['numLot']."</td><td>".$row['quantity']."</td></tr>";
                                }

  $prevAgent = $row['Agent'];
  $prevDate      = $row['date'];
  $prevOperation    = $row['operation'];
  $prevArticle      = $row['article'];
  $prevNum      = $row['num'];
      }
    endif; ?>

我已经为此苦苦挣扎了一段时间。如何以以前的格式打印结果?

【问题讨论】:

  • 你试过什么?请添加用于获取数据并输出数据的代码。
  • 你应该在这里遇到语法错误,就像未定义的索引一样。
  • 请将数据库查询添加到您的问题和 $result 和/或 $row 的调试结果...您目前只显示您想要的内容以及如何生成输出 (html) ,但不是你如何获取数据...谢谢

标签: php html mysql mysqli html-table


【解决方案1】:

您尝试的方式很好,只是您需要正确引用字段名称:它们区分大小写。

$row['Date']$row['date'] 是两个不同的东西,$row['Num']$row['numLot']... 等等。

确保if 条件、echo 语句和$prevXXXX 分配中的键相同。一旦您使用了查询生成的确切键,它就会起作用。

【讨论】:

    【解决方案2】:
    $data = array();
    $data [] = array(
        'Agent' => 'Albert',
        'Date' => 'D1',
        'operation' => 'SL1',
        'article' => 'A',
        'num' => '0001',
        'quantity' => '300',
    );
    $data [] = array(
        'Agent' => 'Albert',
        'Date' => 'D1',
        'operation' => 'SL1',
        'article' => 'A',
        'num' => '0002',
        'quantity' => '400',
    );
    $data [] = array(
        'Agent' => 'Albert',
        'Date' => 'D3',
        'operation' => 'SL2',
        'article' => 'B',
        'num' => '00046',
        'quantity' => '100',
    );
    $data [] = array(
        'Agent' => 'Robert',
        'Date' => 'D3',
        'operation' => 'SL4',
        'article' => 'A',
        'num' => '1231',
        'quantity' => '400',
    );
    $data [] = array(
        'Agent' => 'Robert',
        'Date' => 'D3',
        'operation' => 'SL5',
        'article' => 'C',
        'num' => '888',
        'quantity' => '20',
    );
    $data [] = array(
        'Agent' => 'Robert',
        'Date' => 'D2',
        'operation' => 'SL3',
        'article' => 'B',
        'num' => '9999',
        'quantity' => '90',
    );
    
    //Agent
    $filteredAgent = array();
    foreach ($data as $value) {
        $filteredAgent[$value['Agent']][$value['Date']][$value['operation']][$value['article']][] = $value;
    }
    echo "<pre>";
    print_r($filteredAgent);
    
    foreach ($filteredAgent as $agent => $agentData) {
        echo "Agent : $agent";
        foreach ($agentData as $date => $dateData) {
            echo "<br>";
            echo "\tDate : $date";
            foreach ($dateData as $operation => $operationData) {
                echo "<br>";
                echo "\t\tOperation : $operation";
                foreach ($operationData as $article => $articleData) {
                    echo "<br>";
                    echo "\t\t\tarticle : $article";
                    foreach ($articleData as $finalData) {
                        echo "<br>";
                        echo "\t\t\t\tnum : " . $finalData['num'] . " | Quantity :" . $finalData['quantity'];
                    }
                }
            }
        }
        echo "<br>";
    }
    

    【讨论】:

    • 哇...太棒了! :D 这个比我的好。但问题是,OP 不懂 PHP。
    • 其实它不是复制和过去。我可以在几分钟内写出这种类型的逻辑 ;-) 感谢您的补充
    • 非常感谢 Ankit vadariya :) 这很有魅力
    【解决方案3】:

    你需要做两个分层移动:

    $obj = [[
        "Agent" => "Albert",
        "Date" => "D1",
        "operation" => "SL1",
        "article" => "A",
        "num" => "0001",
        "quantity" => "300"
    ], [
        "Agent" => "Albert",
        "Date" => "D1",
        "operation" => "SL1",
        "article" => "A",
        "num" => "0002",
        "quantity" => "400"
    ], [
        "Agent" => "Albert",
        "Date" => "D3",
        "operation" => "SL2",
        "article" => "B",
        "num" => "00046",
        "quantity" => "100"
    ], [
        "Agent" => "Robert",
        "Date" => "D3",
        "operation" => "SL4",
        "article" => "A",
        "num" => "1231",
        "quantity" => "400"
    ], [
        "Agent" => "Robert",
        "Date" => "D3",
        "operation" => "SL5",
        "article" => "C",
        "num" => "888",
        "quantity" => "20"
    ], [
        "Agent" => "Robert",
        "Date" => "D2",
        "operation" => "SL3",
        "article" => "B",
        "num" => "9999",
        "quantity" => "90"
    ]];
    $agent = [];
    foreach ($obj as $val) {
        $agent[$val["Agent"]][] = $val;
    }
    $agentDate = [];
    foreach ($agent as $agent => $val) {
        foreach ($val as $agDate => $value) {
            $agentDate[$agent][$value["Date"]] = $value;
        }
    }
    

    完成此操作后,您将获得以下形式:

    Array
    (
      [Albert] => Array
        (
          [D1] => Array
            (
              [Agent] => Albert
              [Date] => D1
              [operation] => SL1
              [article] => A
              [num] => 0002
              [quantity] => 400
            )
    
          [D3] => Array
            (
              [Agent] => Albert
              [Date] => D3
              [operation] => SL2
              [article] => B
              [num] => 00046
              [quantity] => 100
            )
    
        )
    
      [Robert] => Array
        (
          [D3] => Array
            (
              [Agent] => Robert
              [Date] => D3
              [operation] => SL5
              [article] => C
              [num] => 888
              [quantity] => 20
            )
    
          [D2] => Array
            (
              [Agent] => Robert
              [Date] => D2
              [operation] => SL3
              [article] => B
              [num] => 9999
              [quantity] => 90
            )
    
        )
    
    )
    

    最后,如果你这样做:

    foreach ($agentDate as $agent => $details) {
        echo "Agent: $agent\n";
        foreach ($details as $date => $value) {
            echo "\tDate: $date\n";
            echo "\t\tOperation: {$value["operation"]}\n";
            echo "\t\t\tARTICLE : {$value["article"]}\n";
            echo "\t\t\t\tnum : {$value["num"]}\n";
        }
    }
    

    你会得到如下输出:

    Agent: ALBERT
         DATE : D1
           Operation: SL1
              ARTICLE : A
                 num: 0001 | Quantity: 300
                 num: 0002 | Quantity: 400
         DATE : D3
           Operation: SL2
              ARTICLE : B
                 num: 00046 | Quantity:100
    Agent: Robert
         DATE: D3
           Operation: SL4
              ARTICLE : A
                 num: 1231  | Quantity: 400
           Operation: SL5
              ARTICLE : C
                 num: 888  | Quantity: 20
         DATE: DX
           Operation: SL3
              ARTICLE : B
                 num: 9999  | Quantity: 90
    

    【讨论】:

    • 我不明白如何才能迈出第一步并将其转换为对象
    • @bpax51 使用你会做的while 循环。如果您不了解 PHP,我们将无法提供帮助。至少获取 SQL DML 和 DDL 查询,以便我们提供帮助。
    • @bpax51 你有的是一个表格的东西,你问的是一个文本输出。你想要表格输出还是文本输出?
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多