如何在表格中每i ==第1次回显元素?

时间:2018-05-26 20:58:59

标签: php foreach datatables

注意" $ db"是我的数据库类的实例," getRows()"是该类中的自定义函数。

我有一个jQuery Datatable,我需要用数据(域名和MX记录)填充它。我需要它打印到表格中:

domain1 |   MX Record1
        |   MX Record2

domain2 |   MX Record1
        |   MX Record2
        |   MX Record3

它使用以下代码以纯文本格式工作:

foreach ($records = $db->getRows("select name, group_concat(content) from records where type='MX' group by name", ['']) as $record) {

    $strings = explode(",", $record['group_concat(content)']);
    $name = $record['name'];
    $count = 0;
    foreach($strings as $string => $mx) {
        $count++;
        if($count <= 1 ) {
            echo "<strong>" . $name . "</strong> | " . $mx;
        }
        else {
            echo "----------------------- | " . $mx;
        }
        echo " -- Count: " . $count . "<br>";

    }
    echo "<br>";

}

输出结果为:

domain1.com | xxxx.xxxxxxxxxxxxx.com -- Count: 1
----------- | xxxx.xxxxxxxxxxxxx.com -- Count: 2
----------  | xxxx.xxxxxxxxxxxxx.com -- Count: 3

domain2.net | xxxx.xxxxxxxxxx.net -- Count: 1
----------- | xxxx.xxxxxxxxxx.net -- Count: 2

domain3.com | xxxx-xxxxxx.xxxxxxxxxxxxxxxxx.com -- Count: 1
----------- | xxxx-xxxxxxx.xxxxxxxxxxxxxxxxx.com -- Count: 2
----------  | xxxx-x.xxxxxxxxxxxxxxxxxxxx.com -- Count: 3

然而,在我的表中,输出很可怕。这是所有内容的代码(减去CSS):

<div class="container">
     <table id="mx_report_table" class="table table-bordered" >
          <thead>
          <tr>
               <th>Name</th>
               <th>MX Record</th>
          </tr>
          </thead>
          <tbody>
          <?php

          foreach($records = $db->getRows("SELECT name, group_concat(content) FROM records WHERE type='MX' GROUP BY name", ['']) as $record) {
              $strings = explode(",", $record['group_concat(content)']);
              $name = $record['name'];
              $count = 0;


              foreach($strings as $string => $mx) {
                  $count++;
                  if($count <= 1) {
                      echo "<tr><td>$name</td><td>$mx</td></tr>";
                  }
                  else {
                      echo "<tr><td></td><td>$mx</td></tr>";
                  }

              }
          }
          ?>
          </tbody>
     </table>
</div>
</body>
<script>
    document.title='MX Report';
    $(function() {
        $('#mx_report_table').DataTable({
            "scrollY":"400px",
            "scrollCollapse":true,
            "paging":true,
            "lengthMenu":[10,25,50,100],
            "pageLength":25
        });
    });
</script>

这是表格的样子:

enter image description here

如果我基本上(至少我认为)在我的桌子上做同样的事情,我哪里出错了?

2 个答案:

答案 0 :(得分:1)

正如我在评论中已经提到的那样,DataTable插件是(故意)通过按第一列的值对所有行进行排序来搞乱的。将"order": false添加到DataTable选项以禁用排序功能。

$('#mx_report_table').DataTable({
    "scrollY":"400px",
    "scrollCollapse":true,
    "paging":true,
    "lengthMenu":[10,25,50,100],
    "pageLength":25,
    "order": false
});

演示:https://jsfiddle.net/bep6uvfo/1/

答案 1 :(得分:0)

  

是的,每个域都有相应的mx记录

您可以循环并将数据输出到表中:

foreach($strings as $string => $mx) {
    echo "<tr>
              <td>$name</td>
              <td>$mx</td>
          </tr>";
}

你的表格只有一行一行看起来相同,在名称栏下留下一个空格让读者不得不“假设”实际上没有遗漏的域名,但他们应该考虑前一个涉及多个MX记录。

我建议使用标题作为域名的单独部分以及每个域名标题下的所有相应MX记录。 如空行或其他任何内容。

我会废除db调用,因为各种各样的事情也可能出错。只需从数组中的DB中获取数据,使用该名称的相应MX记录循环数组中的每个域名,并将名称作为标题行,然后将MX记录放在下面的行中,然后将下一个名称作为标题行及其下面的MX记录。