在遇到新名称时,我尝试在行之间添加<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 :(得分: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>