代码之家  ›  专栏  ›  技术社区  ›  Rzj Hayabusa

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

  •  2
  • Rzj Hayabusa  · 技术社区  · 7 年前

    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>
    

    上面代码的输出如下

    Account Number          Category            Amount
    1001                    Apple               30.00
    1001                    Mango               30.00
    1001                    Blueberry           30.00 
    
    1002                    Durian              40.00
    1002                    Pineapple           40.00
    1002                    Jackfruit           40.00 
    1002                    Lime                40.00
    
    1003                    Lemon               50.00
    1003                    Orange              50.00
    

    帐号 只有一次类别保持循环?

    我的目标是看起来像这样。在每次通信后添加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>
    

    我被困在这里了。感谢有人能帮我解决这个问题。

    谢谢。

    4 回复  |  直到 7 年前
        1
  •  1
  •   synz    7 年前

    试试这样的。

    创建新数组,重新排序并修改它。

    菲律宾比索

    <?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>";
    

    http://sandbox.onlinephpfunctions.com/code/cfd9579dfe39ab9fba6922209ceec1a33debbfc6

        2
  •  2
  •   Javed Sayyed    7 年前

    试试这个。

    $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 }
    
        3
  •  1
  •   david    7 年前

    将您的查询改为此查询

    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
        }
      }
    ?>
    

    GROUP_CONCAT(CATEGORY)

        4
  •  0
  •   mickmackusa Tom Green    7 年前

    你把水果的名字组合起来,然后把它们粘在一起的整个过程 ,<br> 可以 应该 作为最佳实践在查询中执行。当然,可以迭代resultset并使用php函数来准备值,但这样效率会降低,并且会产生更多的代码行。

    根据您发布的详细信息,我可以为您提供最直接、最专业的解决方案是:

    演示: https://www.db-fiddle.com/f/tWn3qKrpHzV86Yq8k8WhCq/2

    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`
    

    根据数据库设置,可能不需要使用 MAX()

    注意,在我的演示链接中,我洗牌了行并添加了一个蔬菜行。如果你的项目需要, GROUP_CONCAT() DISTINCT 如果只希望将唯一值分组在一起。

    如果此解决方案不适合您的实际项目要求,请花时间更新您的问题详细信息,以更准确地反映您正在使用的内容。

    充分准备好结果集后,可以正常地对其进行迭代以显示为html表。

    推荐文章