如何在PHP中使用foreach循环只回显一次特定的多个相同记录?
我在PHP中使用foreach循环获得这些输出。现在foreach内部的输出如下所示 PHP代码如何在PHP中使用foreach循环只回显一次特定的多个相同记录?,php,foreach,Php,Foreach,我在PHP中使用foreach循环获得这些输出。现在foreach内部的输出如下所示 PHP代码 <table> <thead> <tr> <th>ACCOUNT NUMBER</th> <th>CATEGORY</th> <th>AMOUNT</th> </tr> </thead> <tbo
<table>
<thead>
<tr>
<th>ACCOUNT NUMBER</th>
<th>CATEGORY</th>
<th>AMOUNT</th>
</tr>
</thead>
<tbody>
<?php
$sqlTxt = "SELECT * FROM table WHERE column = 'Fruits' ";
$sql = ORACLE::getInstance()->FetchArray($sqlTxt);
if(count($sql) > 0)
{
foreach($sql as $row)
{
?>
<tr>
<td><?php echo $row["ACCOUNT_NUMBER"] ;?></td>
<td><?php echo $row["CATEGORY"]; ?></td>
<td><?php echo $row["AMOUNT"]; ?></td>
</tr>
<?php
}
}
?>
</tbody>
</table>
我的问题是,在分类保持循环的情况下,我如何只回显账号和金额
我的目标是看起来像这样。在每个comas后添加br标签
Account Number Category Amount
1001 Apple, 30.00
Mango,
Blueberry
1002 Durian, 40.00
Pineapple,
Jackfruit,
Lime
1003 Lemon, 50.00
Orange
到目前为止,我的代码是这样的
PHP代码
<table>
<thead>
<tr>
<th>ACCOUNT NUMBER</th>
<th>CATEGORY</th>
<th>AMOUNT</th>
</tr>
</thead>
<tbody>
<?php
$sqlTxt = "SELECT * FROM table WHERE column = 'Fruits' ";
$sql = ORACLE::getInstance()->FetchArray($sqlTxt);
if(count($sql) > 0)
{
$account_numbers = null;
$categorys = "";
$amounts = null;
foreach($sql as $row)
{
if($row['ACCOUNT_NUMBER'] !== $account_numbers)
{
if ($account_numbers !== null)
{
echo '</td></tr>';
}
echo "<tr>
<td>{$row['ACCOUNT_NUMBER']}</td>
<td>{$row['CATEGORY']}";
}
else {
echo "<br>{$selectionC['CATEGORY']}";
}
$account_numbers = $row['ACCOUNT_NUMBER'];
}
echo ' </td>
</tr>';
}
?>
</tbody>
</table>
帐号
类别
数量
将您的查询更改为此查询
SELECT *, GROUP_CONCAT(CATEGORY) AS categories
FROM TABLE
WHERE COLUMN = 'Fruits'
GROUP BY ACCOUNT_NUMBER
完整代码
<?php
$sqlTxt = "SELECT *, GROUP_CONCAT(CATEGORY) as categories FROM table WHERE column = 'Fruits' GROUP BY ACCOUNT_NUMBER";
$sql = ORACLE::getInstance()->FetchArray($sqlTxt);
if(count($sql) > 0)
{
foreach($sql as $row)
{
?>
<tr>
<td><?php echo $row["ACCOUNT_NUMBER"] ;?></td>
<td><?php echo $row["categories"]; ?></td>
<td><?php echo $row["AMOUNT"]; ?></td>
</tr>
<?php
}
}
?>
试试这个
$account_numbers = array();
foreach($sql as $row) {
$display = FALSE;
if(!in_array($row["ACCOUNT_NUMBER"], $account_numbers)) {
$account_numbers[] = $row["ACCOUNT_NUMBER"];
$display = TRUE;
} ?>
<tr>
<td>
<?php echo $display ? $row["ACCOUNT_NUMBER"] : ""; ?>
</td>
<td><?php echo $row["CATEGORY"]; ?></td>
<td><?php echo $row["AMOUNT"]; ?></td>
</tr>
<?php }
$account_numbers=array();
foreach($sql作为$row){
$display=FALSE;
if(!in_数组($row[“ACCOUNT_NUMBER”],$ACCOUNT_NUMBER)){
$account_numbers[]=$row[“account_numbers”];
$display=TRUE;
} ?>
试试这样的
创建新数组,重新排序并修改它
PHP
将水果名称分组并将其与粘在一起的整个过程可以
并且应该作为最佳实践在查询中执行。当然,可以迭代结果集,也可以使用php函数来准备值,但效率较低,并且会产生很大的影响更多的代码行
根据您发布的详细信息,我能为您提供的最直接、最专业的解决方案是:
演示:
选择“帐号”,
组CONCAT(`CATEGORY`ORDER BY`CATEGORY`ASC SEPARATOR',
')作为`CATEGORY`,
最大(`CATEGORY\u AMOUNT`)作为`CATEGORY\u AMOUNT`)`
从`表`
其中,`column`='Fruits'
按“帐号”分组`
按“账号”订购`
根据您的数据库设置,您可能不需要使用MAX()
,但对于我的在线演示,这是必要的
请注意,在我的演示链接中,我洗牌了行并添加了一个蔬菜行。如果您的项目需要,GROUP\u CONCAT()
还提供了DISTINCT
,如果您只希望将唯一的值分组在一起
如果此解决方案不适合您的实际项目要求,请花时间更新您的问题详细信息,以更准确地反映您正在使用的内容
充分准备好结果集后,您可以正常地对其进行迭代以显示为html表。@mickmackusa。感谢您的反馈。如果您不介意,可以将其显示给答案吗?再次感谢。或者(如果在循环中进行更多处理)@mickmackusa。它适用于新产品线。谢谢。但还有一个问题,那就是只将多个记录合并/分组到一个输出中。这是一个非常简单的控制中断,您想在这里实现。您需要做的就是将当前账号与前一个账号进行比较-如果它不同,您就输出它,否则您就不输出了。@CBroe。谢谢谢谢你的反馈。比较值是在foreach内部还是外部?谢谢你的回答。不幸的是,我的sql查询太复杂,并且有多层。这就是为什么我只想在foreach内部执行它。再次感谢。你的问题没有显示出任何复杂的迹象。除非缺少分隔符
,这就是我想要的我会推荐。如果这还不够好,请解释原因。谢谢你的反馈javed。我会让它先试用。我会让你知道的。你好javed。它可以工作。当类别显示循环值时,帐号和金额列可以显示一次。但是如何使它显示在每个帐户的单个tr标记行上?我投了反对票because此答案不提供所需的结果,是一个仅代码的答案。这不会尝试编写html表。当然这里没有html表。我只是给出一个示例和想法。只需在foreach(之前/之后)编辑以放置表和其他内容。不要期望我需要将所有内容都放在其中。从上一个结果(echo),你应该已经知道下一步要做什么了。你的代码就是我想要的synz。但是如何在上面添加tr和td标记?每个帐户一行表格单元格。再次感谢。最后echo.putecho$item[$key]['account\u NUMBER'.-“$item[$key]['CATEGORY'.-”$item[$key]['AMOUNT'.\n”;
将它们分开。@synz.Nice.最后一个问题。如何在comas之后的分类列上添加br标记?对不起,问题太多了。@Rozaimi这对我(以及这个社区中其他非常关心网站内容质量的用户)非常重要向您提供可能的最佳解决方案,并且您了解它,并且它被指定为最佳解决方案。指定最佳解决方案非常重要,因为现有页面通常用于关闭新的重复问题。当我选择旧页面来关闭新页面时,我需要确信新的研究人员将能够找到最好的解决方案。绿色勾号吸引了很多注意力,所以我相信它应该是“最佳”答案。
$account_numbers = array();
foreach($sql as $row) {
$display = FALSE;
if(!in_array($row["ACCOUNT_NUMBER"], $account_numbers)) {
$account_numbers[] = $row["ACCOUNT_NUMBER"];
$display = TRUE;
} ?>
<tr>
<td>
<?php echo $display ? $row["ACCOUNT_NUMBER"] : ""; ?>
</td>
<td><?php echo $row["CATEGORY"]; ?></td>
<td><?php echo $row["AMOUNT"]; ?></td>
</tr>
<?php }
<?php
$arr_old = array(
0 => array('ACCOUNT_NUMBER' => '1001', 'CATEGORY' => 'Apple', 'AMOUNT' => '30.00'),
1 => array('ACCOUNT_NUMBER' => '1001', 'CATEGORY' => 'Mango', 'AMOUNT' => '30.00'),
2 => array('ACCOUNT_NUMBER' => '1001', 'CATEGORY' => 'Blueberry', 'AMOUNT' => '30.00'),
3 => array('ACCOUNT_NUMBER' => '1002', 'CATEGORY' => 'Durian', 'AMOUNT' => '40.00'),
4 => array('ACCOUNT_NUMBER' => '1002', 'CATEGORY' => 'Pineapple', 'AMOUNT' => '40.00'),
5 => array('ACCOUNT_NUMBER' => '1002', 'CATEGORY' => 'Lime', 'AMOUNT' => '40.00'),
6 => array('ACCOUNT_NUMBER' => '1003', 'CATEGORY' => 'Lemon', 'AMOUNT' => '50.00'),
7 => array('ACCOUNT_NUMBER' => '1002', 'CATEGORY' => 'Jackfruit', 'AMOUNT' => '40.00'),
8 => array('ACCOUNT_NUMBER' => '1003', 'CATEGORY' => 'Orange', 'AMOUNT' => '50.00')
);
$arr = array();
foreach($arr_old as $key => $item)
{
if(!array_key_exists($item['ACCOUNT_NUMBER'],$arr)){
// Add new data in array with ACCOUNT_NUMBER as an index
$arr[$item['ACCOUNT_NUMBER']][$item['ACCOUNT_NUMBER']]['ACCOUNT_NUMBER'] = $item['ACCOUNT_NUMBER'];
$arr[$item['ACCOUNT_NUMBER']][$item['ACCOUNT_NUMBER']]['CATEGORY'] = $item['CATEGORY'];
$arr[$item['ACCOUNT_NUMBER']][$item['ACCOUNT_NUMBER']]['AMOUNT'] = $item['AMOUNT'];
}else{
// Only alter category index
$arr[$item['ACCOUNT_NUMBER']][$item['ACCOUNT_NUMBER']]['CATEGORY'] .= ",".$item['CATEGORY'];
}
}
ksort($arr, SORT_NUMERIC);
echo "<table>";
echo "<tr>";
echo "<td>ACCOUNT_NUMBER</td>";
echo "<td>CATEGORY</td>";
echo "<td>AMOUNT</td>";
echo "</tr>";
foreach($arr as $key => $item){
$xpl = explode(",",$item[$key]['CATEGORY']);
$n_category = "";
foreach($xpl as $b => $a){
$n_category .= ($b!=0) ? "<br>".$a : $a ;
}
echo "<tr>";
echo "<td>".$item[$key]['ACCOUNT_NUMBER']."</td>";
echo "<td>".$n_category."</td>";
echo "<td>".$item[$key]['AMOUNT']."</td>";
echo "</tr>";
// print_r($item);
}
echo "</table>";
SELECT `ACCOUNT_NUMBER`,
GROUP_CONCAT(`CATEGORY` ORDER BY `CATEGORY` ASC SEPARATOR ',<br>') AS `CATEGORY`,
MAX(`CATEGORY_AMOUNT`) AS `CATEGORY_AMOUNT`
FROM `table`
WHERE `column` = 'Fruits'
GROUP BY `ACCOUNT_NUMBER`
ORDER BY `ACCOUNT_NUMBER`