PHP 自寫的分頁


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接收一個分頁的數組或對象,通過下表鍵值檢索數組對象,把目標數據傳給模板,顯示,避免重復查詢數據庫。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM