2017-08-08 8 views
1

我试图在遇到新名称时在行之间添加<hr>标记。如何在查询结果集的唯一行之间添加<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> 
+0

那你试试这么远吗? – Dekel

+0

@Dekel你好!,我已经试过这个https://stackoverflow.com/questions/18438140/find-duplicate-value-in-multi-dimensional-array/18438311#18438311和其余的答案,但似乎并没有为我工作:/ – Madtin

+1

[可能重复](https://stackoverflow.com/questions/25221390/php-count-duplicate-values-within-two-dimensional-array-then-display-only-uni) – Matt

回答

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> 
+0

你好,如果我想在重复值之后加上hr?例如看到我想要的结果,非常感谢:) – Madtin

+0

@Madtin这正是我的方法所做的。我发布的结果与您的发布结果不匹配的原因是因为我任意排列了阵列ASC中的名称。看到这个[demo](http://sandbox.onlinephpfunctions.com/code/5129890fcc320e14951e70a085ae8424fdc23328),我有6行和3个独特的名字,而hr在每个集合之间。 – mickmackusa

+0

是的但是如果我有这样的数组! [演示](http://sandbox.onlinephpfunctions.com/code/2311256f1bb45d6cea47e6d88edc386534a1684a),我想在复制马丁之后的小时呢? – Madtin

1

该解决方案将方便:

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

如果你不在乎重复的名称是什么,或者有多少重复存在,你只是想看看是否有任何,它看起来可能比一些可能的重复答案更简单的代码。

获取名称

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

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

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

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

相关问题