Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用foreach循环只回显一次特定的多个相同记录?_Php_Foreach - Fatal编程技术网

如何在PHP中使用foreach循环只回显一次特定的多个相同记录?

如何在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

我在PHP中使用foreach循环获得这些输出。现在foreach内部的输出如下所示

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)
      {
        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.put
echo$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`