伊莉討論區

標題: 從資料庫取得的值輸出時省略相同欄 [打印本頁]

作者: allan222    時間: 2017-8-3 09:27 PM     標題: 從資料庫取得的值輸出時省略相同欄

舉例來說:
<< SQL 搜尋語法 >>
得到資料如下:
國家    血型    姓名
英國      A      KEN
英國      A      BEN
英國      B      GG
英國      B      YY
美國      O      AMER

那我需要輸出在畫面上的結果是:
國家     血型      姓名
英國       A       KEN   
                      BEN
             B       GG
                      YY
美國       O       AMER

請問要怎麼用出這樣的輸出呢
我嘗試過 在 搜尋語法前 先用變數紀錄會有相同欄位的值
讓它在找下一筆的時候 如果一樣就不輸出
可是這樣會碰到一個問題
就是萬一一次搜尋有好多筆
那就都會輸出那一次重複的了
請各位大大幫幫我 謝謝



作者: allan222    時間: 2017-8-4 04:05 PM

那請問前端要怎麼去操作他呢

作者: allan222    時間: 2017-8-4 08:21 PM

我目前的做法就是如此
我用變數來記錄前一筆
這是我的方法:
假設欄位名稱是國家=country, 血型=blood
我先用變數紀錄
$country = $ac[0];
$blood = $ac[1];
然後搜尋
if($country <> $ac[0])
輸出
else
不輸出
blood亦同

只是就會出現一次兩筆的搜尋結果
所以輸出結果就會如下:
國家 血型 姓名
英國 A KEN
英國 A BEN
      B GG
      B YY
美國 O AMER

由於KEN 和 BEN 的資料是一起出現的 所以他們的資料都被輸出
但GG YY 是第第二次搜尋出來的 所以變數有記錄到 故 國家不輸出 但因為血型不同 所以也都被輸出
請問我有沒有辦法能在一次搜尋中抓到一筆資料來記錄呢?
作者: ren1244    時間: 2017-8-5 02:56 AM

猜不出是什麼理由必需一次要一筆資料
但如果原本的寫法已經可以正常輸出
只差部分欄位想要「不顯示」的話
照著原程式碼應該可以有這種懶人改法:
  1. if($country <> $ac[0]){
  2.     //輸出
  3.     $country=$ac[0]; //重設$country為新的值
  4. }
  5. else
  6.     //不輸出
複製代碼

作者: shsing1    時間: 2017-8-13 02:28 PM

先用三維陣列存資料,再輸出即可
作者: cswordli    時間: 2017-8-19 08:18 AM

allan222 發表於 2017-8-4 08:21 PM
我目前的做法就是如此
我用變數來記錄前一筆
這是我的方法:

我來試試,想法如下:
1. 假設從DB取出的每一列資料都放到$DATA的二維陣列中且一定要用sql指定先排序country, blood, name。
2. 在輸出$DATA時做以下小調整:
$rec_country = '';
$rec_blood = '';
foreach( $DATA as $key => $val){
  if($DATA['country']!=$rec_country){ $country=$rec_country=$DATA['country']; } else{$country='';}
  if($DATA['blood']!=$rec_blood){ $blood=$rec_blood=$DATA['blood']; } else{$blood='';}
  $str = " $country , $blood , $其它欄1 , $其它欄2 <br>";
  echo $str;
}
3. 希望能幫上忙,以上code僅做示意,有錯請指正並請自己再試試,Good Luck!
作者: jkl99    時間: 2017-8-23 12:30 AM

本帖最後由 jkl99 於 2017-8-23 12:30 AM 編輯
cswordli 發表於 2017-8-19 08:18 AM
我來試試,想法如下:
1. 假設從DB取出的每一列資料都放到$DATA的二維陣列中且一定要用sql指定先排序count ...

假設 $LIST 是所有紀錄
$rec = array();
foreach($LIST as $DATA)
{
    $has_rec = (count($rec) > 0)?true:false;
    $output = array();
    foreach($DATA as $field => $value)
    {
        $output[] = ($has_rec && $rec[$field] == $DATA[$field])?"": $DATA[$field];
    }
    echo implode(" ", $output)."<br />";
    $rec = $DATA;
}
作者: play4140    時間: 2017-10-19 05:54 PM

本帖最後由 play4140 於 2017-10-19 06:23 PM 編輯

如果沒用 sql 先排序的話,使用 array_multisort() 來排序也行,

如果 sql 或  array_multisort() 排序好了,簡單的邏輯如下:

(一)直接使用資料庫 fetch 的資料直接列印
  1. if (count($LIST)){
  2.         $country = '';
  3.         $blood = '';
  4.         foreach($LIST as $DATA){
  5.                 $DATA['country'] = $DATA['country'] != $country ? $country = $DATA['country'] : '';
  6.         $DATA['blood'] = $DATA['blood'] != $blood ? $blood = $DATA['blood'] : '';
  7.                         echo implode(",", $DATA)."<br />";
  8.                 }
  9.         }
複製代碼

(二)使用過濾後的資料集列印:
  1. // 如果一定要反回集合,除了 array_map() 還能用 array_walk() 、 array_filter()

  2.         // 取得過濾後的資料集
  3.         $default = ['country' => '', 'blood' => ''];
  4.         $newList = array_map(function ($DATA) {
  5.                 global $default;
  6.                 $DATA['country'] = $DATA['country'] != $default['country'] ? $default['country'] = $DATA['country'] : '';
  7.                 $DATA['blood'] = $DATA['blood'] != $default['blood'] ? $default['blood'] = $DATA['blood'] : '';
  8.                 return $DATA;
  9.         }, $LIST);
  10.         
  11.         if (count($newList)){
  12.         foreach($newList as $DATA){
  13.                         echo implode(",", $DATA)."<br />";
  14.                 }
  15.         }
複製代碼

輸出成表格的範例:
  1. <?php
  2. // 排序完成的資料集如:

  3. $LIST = [
  4.    ['country'=>'英國', 'blood'=>'A', 'name'=> 'KEN'],
  5.    ['country'=>'英國', 'blood'=>'A', 'name'=> 'BEN'],
  6.     ['country'=>'英國', 'blood'=>'A', 'name'=> 'JHON'],
  7.     ['country'=>'英國', 'blood'=>'A', 'name'=> 'WILL'],
  8.     ['country'=>'英國', 'blood'=>'B', 'name'=> 'GG'],
  9.    ['country'=>'英國', 'blood'=>'B', 'name'=> 'YY'],
  10.     ['country'=>'英國', 'blood'=>'B', 'name'=> 'ZZ'],
  11.     ['country'=>'美國', 'blood'=>'O', 'name'=> 'AMER']
  12. ];

  13. // 假設列印成表格(使用資料庫 fetch 的資料直接列印)

  14. print <<<TABLE
  15. <table border="1" width="500">
  16.   <caption>使用資料庫 fetch 的資料直接列印</caption>
  17.   <thead>
  18.     <tr>
  19.       <th>國家</th>
  20.       <th>血型</th>
  21.       <th>姓名</th>
  22.     </tr>
  23.   </thead>
  24. TABLE;
  25. if (count($LIST)){
  26.    $country = '';
  27.    $blood = '';
  28.    foreach($LIST as $DATA){
  29.       $outputCountry = $DATA['country'] != $country ? $country = $DATA['country'] : '';
  30.         $outputBlood = $DATA['blood'] != $blood ? $blood = $DATA['blood'] : '';
  31.         // print 資料
  32.       print <<<TBODY
  33. <tbody>
  34.     <tr>
  35.       <td>{$outputCountry}</td>
  36.       <td>{$outputBlood}</td>
  37.       <td>{$DATA['name']}</td>
  38.     </tr>
  39. </tbody>
  40. TBODY;
  41.    }
  42.    print '</table>';
  43. }

  44. //-------------------------------------------------------------------------
  45. // 如果一定要反回集合,除了 array_map() 還能用 array_walk() 、 array_filter()

  46. $default = ['country' => '', 'blood' => ''];
  47. $newList = array_map(function ($DATA) {
  48.    global $default;
  49.    $DATA['country'] = $DATA['country'] != $default['country'] ? $default['country'] = $DATA['country'] : '';
  50.     $DATA['blood'] = $DATA['blood'] != $default['blood'] ? $default['blood'] = $DATA['blood'] : '';
  51.    return $DATA;
  52. }, $LIST);
  53.    
  54.     // 使用過濾後的資料集列印
  55.     print <<<TABLE
  56. <hr/>
  57. <table border="1" width="500">
  58.   <caption>使用過濾後的資料集列印</caption>
  59.   <thead>
  60.     <tr>
  61.       <th>國家</th>
  62.       <th>血型</th>
  63.       <th>姓名</th>
  64.     </tr>
  65.   </thead>
  66. TABLE;
  67.     if (count($newList)){
  68.         foreach($newList as $DATA){
  69.             // print 資料
  70.             print <<<TBODY
  71. <tbody>
  72.     <tr>
  73.       <td>{$DATA['country']}</td>
  74.       <td>{$DATA['blood']}</td>
  75.       <td>{$DATA['name']}</td>
  76.     </tr>
  77. </tbody>
  78. TBODY;
  79.         }
  80.         print '</table>';
  81.     }

  82. ?>
複製代碼







歡迎光臨 伊莉討論區 (http://www31.eyny.com/) Powered by Discuz!