如何在查询结果集的唯一行之间添加<hr />标记?

时间:2017-08-08 23:04:40

标签: php html arrays grouping

在遇到新名称时,我尝试在行之间添加<hr>标记。

$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>

3 个答案:

答案 0 :(得分:2)

如果您不关心重复名称是什么或者存在多少重复项,并且您只是想知道是否有任何副本,看起来它可能比一些可能的重复答案更简单的代码

获取姓名

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

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

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

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

答案 1 :(得分:1)

这个解决方案很方便:

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

答案 2 :(得分:0)

只需一个循环即可实现。首先,使用您的mysqli查询按name_real对结果集进行排序。 (如果您只打算使用name_real,则可以更改SELECT子句以反映这一点。我已在注释查询中显示此内容。)然后编写一个检查新/唯一name_real的条件 - 如果是,请回显<hr>

代码:(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>