【问题标题】:How to add <hr> tags between unique rows from query resultset?如何在查询结果集中的唯一行之间添加 <hr> 标签?
【发布时间】:2017-08-09 23:55:58
【问题描述】:

当遇到新名称时,我正在尝试在行之间添加&lt;hr&gt; 标记。

$conn = new mysqli("localhost", "root", "", "test");
$rs = $conn->query("SELECT * FROM usuarios");

$info = [];
$i = 0;
while($rows = $rs->fetch_array()) {
    $info[$i]["pass"] = $rows["pass"];
    $info[$i]["name"] = $rows["name_real"];
    $i++;
}
// I want to print a line just after the last duplicated value
for($i = 0; $i < count($info) - 1; $i++) {
    if($info[$i]["name"] !== $info[$i +1]["name"] && // some duplicate condition) {
        $info[$i]["line"] = "<hr>";
    };
}

这是我从结果集中构建的 info 数组的结构。

Array
(
[0] => Array
    (
        [pass] => 12
        [name] => Martin
    )

[1] => Array
    (
        [pass] => 20
        [name] => Martin
    )

[2] => Array
    (
        [pass] => 2
        [name] => Martin
    )
[3] => Array
    (
        [pass] => 2
        [name] => Alberto
    )
)

我想要的结果是这样的:

<p>Martin<p>
<p>Martin<p>
<p>Martin<p>
<hr>
<p>Alberto<p>

【问题讨论】:

标签: php html arrays grouping


【解决方案1】:

如果您不关心重复名称是什么或存在多少重复项,而只想查看是否存在重复项,那么它看起来可能比某些可能的重复答案更简单。

获取名称

$names = array_column($array, 'name');

然后检查名称的完整列表是否等于唯一列表。

$has_duplicates = $names != array_unique($names);

免责声明:这个答案现在看起来很奇怪。它是为Revision 1 of the question 提供的。我似乎有点误解了这个问题,然后修订版 2 将其转变为这个答案不再适用的程度。不过,我认为它是一种有用的方式来完成最初似乎试图完成的事情。

【讨论】:

    【解决方案2】:

    这个解决方案会很方便:

    $result = array();
    $names = array_count_values(array_column($source, 'name'));
    foreach($names as $key=>$val) {
        $result[$key] = ($val == 1 ? false : true);
    }
    

    【讨论】:

      【解决方案3】:

      这可以通过一个循环来实现。首先,使用您的 mysqli 查询按name_real 对结果集进行排序。 (如果您只打算使用name_real,您可以更改 SELECT 子句以反映这一点。我已在注释查询中显示了这一点。)然后编写一个条件来检查新的/唯一的 name_real - 如果是这样,回显&lt;hr&gt;

      代码:(Demo)

      //$rs = $conn->query("SELECT `name_real` FROM usuarios ORDER BY `name_real`;");
      $rs=[
          ['pass'=>2,'name_real'=>'Alberto'],
          ['pass'=>12,'name_real'=>'Martin'],
          ['pass'=>20,'name_real'=>'Martin'],
          ['pass'=>2,'name_real'=>'Martin']
      ];
      
      $prev=NULL;
      //while($rows = $rs->fetch_array()) {
      foreach($rs as $rows){
          if($prev && $rows['name_real']!=$prev){  // if not first iteration, and new name_real
              echo "<hr>";
          }
          echo "<p>{$rows['name_real']}</p>";
          $prev=$rows['name_real'];  // preserve this value for next iteration's check
      }
      

      输出:

      <p>Alberto</p>
      <hr>
      <p>Martin</p>
      <p>Martin</p>
      <p>Martin</p>
      

      【讨论】:

      • 您好,如果我想在重复值之后添加 hr?例如,看看我想要的结果,非常感谢:)
      • @Madtin 这正是我的方法所做的。我发布的结果与您发布的结果不符的原因是我任意排序了数组 ASC 中的名称。请参阅此demo,其中我有 6 行和 3 个唯一名称,并且 hr 位于每组之间。
      • 是的,但是如果我有这样的数组呢! demo 我也想要复制的马丁之后的小时?
      • @Madtin 好的,很简单,循环结束后手动添加echo "&lt;hr&gt;";即可。
      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多