fenye.php
1 <?php 2 3 /** 4 * @param 待分頁數組 必須 5 * @param 第幾頁 必須 6 * @param 每頁數量 可選,不填等於10 7 */ 8 function fenye($arr, $page, $countofpage = 10) { 9 /* 總記錄數 */ 10 $totalcount = count($arr); 11 /* 總的分頁數 */ 12 $numofpage = ceil($totalcount / $countofpage); 13 /* 起始記錄基數,數組的下表從0開始,所以$start的最小值為0,並以$countofpage為倍數遞增 */ 14 $start = (($page - 1) * $countofpage); 15 /* 結束記錄基數 */ 16 $end = $page * $countofpage; 17 /* 邊界處理 */ 18 if ($page == $numofpage) { 19 $end = $totalcount; 20 } else if ($page > $numofpage) { 21 /* 非法輸入時,定位到第一頁 */ 22 $start = 0; 23 $end = $countofpage; 24 } 25 /* 目標數據的下表區間,比如第一頁,10條記錄,區間為:[0,10) */ 26 for ($i = $start; $i < $end; $i++) { 27 $num[$i] = $i; 28 } 29 foreach ($arr as $key => $value) { 30 if (in_array($key, $num)) { 31 $temp[$key] = $value; 32 } 33 } 34 return $temp; 35 } 36 37 /** 38 * 返回分頁下標,如前一頁,下一頁,第一頁,最后一頁等,顯示分頁的數量和頁數 39 * @param type 分頁的數組 40 * @param type 當前頁 41 * @param type 在數組里的下標 42 * @param type 每頁的數量 43 * @return 二維數組 44 */ 45 function getlastpage($arr, $page, $index, $countofpage = 10) { 46 /* 總記錄數 */ 47 $totalcount = count($arr); 48 /* 總的分頁數 */ 49 $numofpage = ceil($totalcount / $countofpage); 50 /* 上一頁 */ 51 $temp[$index]['before'] = $page - 1; 52 /* 當前頁 */ 53 $temp[$index]['page'] = $page; 54 /* 下一頁 */ 55 $temp[$index]['next'] = $page + 1; 56 /* 最后一頁 */ 57 $temp[$index]['last'] = $numofpage; 58 /* 總記錄數 */ 59 $temp[$index]['total'] = $totalcount; 60 return $temp; 61 } 62 63 /** 64 * 65 * @param 分頁的數組 66 * @param 在數組里的下標 67 * @return 二維數組 68 */ 69 function showheader($arr = '', $index = '') { 70 $temp = array(); 71 if (!empty($arr)) { 72 $temp[$index] = $arr; 73 } 74 return $temp; 75 } 76 77 /** 78 * 合並表頭和分頁內容 79 * @param type $arr 分頁內容 80 * @param type $page 當前頁 81 * @param type $option 表頭內容 82 * @param type $countofpage 每頁數量 83 * @return type 二維數組 84 */ 85 function showtable($arr, $option = '', $page = 1, $countofpage = 10) { 86 $result = array_merge( 87 showheader($option, $countofpage + 1), 88 getlastpage($arr, $page, $countofpage + 2, $countofpage), 89 fenye($arr, $page, $countofpage) 90 ); 91 return $result; 92 }
通過函數showtable()合並三個數組,分別是表頭數組,翻頁數組和內容數組。
表頭數組為可選參數,表示每一列的值的意思,翻頁數組顧名思義是用來存放翻頁按鈕的數值的,內容數組存放翻頁的內容。
該分頁方法的好處是只需要調用showtable()方法並傳入對應的參數,就可以返回一個包裝好的二維數組,通過在模板上遍歷和現實,實現分頁。
例子:
引用:include './fenye.php';
准備表頭數組:
1 $option['id'] = "id"; 2 $option['bno'] = "棟號"; 3 $option['rno'] = "宿舍號"; 4 $option['rtel'] = "宿舍電話"; 5 $option['rsir'] = "宿舍長"; 6 $option['rstate'] = "是否可入住"; 7 $option['rbed'] = "剩余床位"; 8 $option['rcop'] = "管理宿舍";
准備分頁內容數組:
1 $sql = "select * from room order by rid"; 2 $result = $pdo->query($sql); 3 $arr = $result->fetchAll(PDO::FETCH_ASSOC);
指定每頁數量和第幾頁:
1 $countofpage = 10; 2 $page = 1;
調用函數,打印結果:
1 $resu = showtable($arr, $option, $page, $countofpage); 2 var_dump($resu);die;
通過改變頁數,實現顯示不同的分頁內容,以下是打印第一頁,每頁包含十條數據的二維數組:
1 array 2 0 => 3 array 4 'id' => string 'id' (length=2) 5 'bno' => string '棟號' (length=6) 6 'rno' => string '宿舍號' (length=9) 7 'rtel' => string '宿舍電話' (length=12) 8 'rsir' => string '宿舍長' (length=9) 9 'rstate' => string '是否可入住' (length=15) 10 'rbed' => string '剩余床位' (length=12) 11 'rcop' => string '管理宿舍' (length=12) 12 1 => 13 array 14 'before' => int 0 15 'page' => string '1' (length=1) 16 'next' => int 2 17 'last' => float 3 18 'total' => int 28 19 2 => 20 array 21 'rid' => string '1' (length=1) 22 'rno' => string '414' (length=3) 23 'rbno' => string 'D棟棟' (length=7) 24 'tel' => string '13445678901' (length=11) 25 'hr' => string 'tom' (length=3) 26 'state' => string '可入住' (length=9) 27 'hb' => string '1' (length=1) 28 3 => 29 array 30 'rid' => string '3' (length=1) 31 'rno' => string '416' (length=3) 32 'rbno' => string 'D棟' (length=4) 33 'tel' => string '13445678901' (length=11) 34 'hr' => string 'as' (length=2) 35 'state' => string '可入住' (length=9) 36 'hb' => string '2' (length=1) 37 4 => 38 array 39 'rid' => string '4' (length=1) 40 'rno' => string '416' (length=3) 41 'rbno' => string 'D棟' (length=4) 42 'tel' => string '13445678901' (length=11) 43 'hr' => string 'as' (length=2) 44 'state' => string '可入住' (length=9) 45 'hb' => string '2' (length=1) 46 5 => 47 array 48 'rid' => string '5' (length=1) 49 'rno' => string '416' (length=3) 50 'rbno' => string 'D棟' (length=4) 51 'tel' => string '13445678901' (length=11) 52 'hr' => string 'as' (length=2) 53 'state' => string '可入住' (length=9) 54 'hb' => string '2' (length=1) 55 6 => 56 array 57 'rid' => string '6' (length=1) 58 'rno' => string '416' (length=3) 59 'rbno' => string 'D棟' (length=4) 60 'tel' => string '13445678901' (length=11) 61 'hr' => string 'as' (length=2) 62 'state' => string '可入住' (length=9) 63 'hb' => string '2' (length=1) 64 7 => 65 array 66 'rid' => string '7' (length=1) 67 'rno' => string '416' (length=3) 68 'rbno' => string 'D棟' (length=4) 69 'tel' => string '13445678901' (length=11) 70 'hr' => string 'as' (length=2) 71 'state' => string '可入住' (length=9) 72 'hb' => string '2' (length=1) 73 8 => 74 array 75 'rid' => string '8' (length=1) 76 'rno' => string '416' (length=3) 77 'rbno' => string 'D棟' (length=4) 78 'tel' => string '13445678901' (length=11) 79 'hr' => string 'as' (length=2) 80 'state' => string '可入住' (length=9) 81 'hb' => string '2' (length=1) 82 9 => 83 array 84 'rid' => string '9' (length=1) 85 'rno' => string '416' (length=3) 86 'rbno' => string 'D棟' (length=4) 87 'tel' => string '13445678901' (length=11) 88 'hr' => string 'as' (length=2) 89 'state' => string '可入住' (length=9) 90 'hb' => string '2' (length=1) 91 10 => 92 array 93 'rid' => string '10' (length=2) 94 'rno' => string '416' (length=3) 95 'rbno' => string 'D棟' (length=4) 96 'tel' => string '13445678901' (length=11) 97 'hr' => string 'as' (length=2) 98 'state' => string '可入住' (length=9) 99 'hb' => string '2' (length=1) 100 11 => 101 array 102 'rid' => string '11' (length=2) 103 'rno' => string '416' (length=3) 104 'rbno' => string 'D棟' (length=4) 105 'tel' => string '13445678901' (length=11) 106 'hr' => string 'as' (length=2) 107 'state' => string '可入住' (length=9) 108 'hb' => string '2' (length=1)
最后把返回的一個二維數組通過模板顯示出來:
1 <table> 2 <tr bgcolor="#FFFFFF"> 3 <td >{$resu[0]['id']}</td> 4 <td >{$resu[0]['bno']}</td> 5 <td >{$resu[0]['rno']}</td> 6 <td >{$resu[0]['rtel']}</td> 7 <td >{$resu[0]['rsir']}</td> 8 <td >{$resu[0]['rstate']}</td> 9 <td >{$resu[0]['rbed']}</td> 10 <td >{$resu[0]['rcop']}</td> 11 </tr> 12 {foreach item=row from=$resu key=mykey} 13 {if $mykey>1} 14 <tr bgcolor="#FFFFFF"> 15 <td >{$row["rid"]}</td> 16 <td >{$row["rbno"]}</td> 17 <td >{$row["rno"]}</td> 18 <td >{$row["tel"]}</td> 19 <td>{$row["hr"]}</td> 20 <td>{$row["state"]}</td> 21 <td>{$row["hb"]}</td> 22 <td width="12%"> 23 <a href="room_del.php?rid={$row['rid']}" onclick="return confirm'你真的確定要刪除嗎?');">刪除</a> 24 <a href="room_modify.php?rid={$row['rid']}">修改</a> 25 </td> 26 </tr> 27 {/if} 28 {/foreach} 29 </tabale> 30 <table width="95%" border="0" align="center" cellpadding="0" cellspacing="0"> 31 <tr> 32 {if $resu[1]['page']!=1} 33 <td><a href="room_show.php?act=testing&page=1">first</a></td> 34 <td><a href="room_show.php?act=testing&page={$resu[1]['before']}">before</a></td> 35 {/if} 36 {if $resu[1]['page']!= $resu[1]['last']} 37 <td><a href="room_show.php?act=testing&page={$resu[1]['next']}">next</a></td> 38 <td><a href="room_show.php?act=testing&page={$resu[1]['last']}">last</a></td> 39 {/if} 40 </tr> 41 </table>
通過簡單的表格顯示出來,如下圖:
拓展:
1、可以拓展函數showtable(),把分頁內容里需要的鏈接通過數組傳進去,同樣的在模板上分配顯示;
2、可以寫一個大眾化的模板,並加上css修飾,一起打包成分頁工具;
3、每次翻頁都會重新去查詢數據庫,如果數據庫的數據記錄特別多的話,此方法效率上可能不理想,可以使用javascript接收一個分頁的數組或對象,通過下表鍵值檢索數組對象,把目標數據傳給模板,顯示,避免重復查詢數據庫。