array_slice 是 PHP 陣列切片利器,支援正負偏移、長度控制、鍵名保留。本文詳細解析參數行為,並提供完整的陣列分頁實作範例。
函數語法
array_slice(array, offset, length, preserve_keys)
| 參數 | 說明 |
| array | 輸入陣列(必填) |
| offset | 起始位置:正數從前往後、負數從後往前 |
| length | 切片長度:正數向後、負數向前;省略則切到結尾 |
| preserve_keys | true 保留原鍵名、false(預設)重新索引 |
基本範例
<?php
$arr = [0, 1, 2, 3, 4];
var_dump(array_slice($arr, 0, 2)); // [0, 1]
var_dump(array_slice($arr, -2, 1)); // [3]
var_dump(array_slice($arr, 1, -1)); // [1, 2, 3]
$assoc = ['a'=>[1,2], 'b'=>[3,4]];
var_dump(array_slice($assoc, 0, 1, true)); // 保留鍵 'a'
?>
實戰:陣列分頁完整實作
<?php
// 模擬資料庫查詢結果(二維陣列)
$arr = [
['name'=>'name1','sex'=>'sex1','job'=>'job1'],
['name'=>'name2','sex'=>'sex2','job'=>'job2'],
['name'=>'name3','sex'=>'sex3','job'=>'job3'],
['name'=>'name4','sex'=>'sex4','job'=>'job4'],
['name'=>'name5','sex'=>'sex5','job'=>'job5'],
['name'=>'name6','sex'=>'sex6','job'=>'job6'],
['name'=>'name7','sex'=>'sex7','job'=>'job7'],
['name'=>'name8','sex'=>'sex8','job'=>'job8'],
['name'=>'name9','sex'=>'sex9','job'=>'job9'],
['name'=>'name10','sex'=>'sex10','job'=>'job10'],
['name'=>'name11','sex'=>'sex11','job'=>'job11'],
['name'=>'name12','sex'=>'sex12','job'=>'job12'],
];
$perpage = 3; // 每頁筆數
$total = count($arr); // 總筆數
$pages = ceil($total/$perpage); // 總頁數
// 取得當前頁碼(預設第 1 頁)
$page = isset($_GET['page']) && is_numeric($_GET['page']) ? (int)$_GET['page'] : 1;
$page = max(1, min($page, $pages)); // 限制範圍
$start = ($page - 1) * $perpage;
$pageData = array_slice($arr, $start, $perpage, true); // 保留鍵名
?>
<table border="1" cellpadding="5">
<tr><th>Name</th><th>Sex</th><th>Job</th></tr>
<?php foreach ($pageData as $row): ?>
<tr>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['sex']; ?></td>
<td><?php echo $row['job']; ?></td>
</tr>
<?php endforeach; ?>
</table>
<div class="pagination">
<?php if ($page > 1): ?>
<a href="?page=1">首頁</a>
<a href="?page=<?php echo $page-1; ?>">上一頁</a>
<?php endif; ?>
<?php if ($page < $pages): ?>
<a href="?page=<?php echo $page+1; ?>">下一頁</a>
<a href="?page=<?php echo $pages; ?>">末頁</a>
<?php endif; ?>
</div>
進階技巧
- 多維陣列分頁:
preserve_keys=true 保留原始鍵名,避免重新索引導致關聯資料錯位
- 記憶體優化:大量資料請用資料庫
LIMIT OFFSET,勿先 fetchAll 再切片
- 負數長度:
array_slice($arr, 2, -1) 從索引 2 切到倒數第 2(不含最後 1 筆)
相關函數對照
| 函數 | 用途 |
| array_slice | 切片(不修改原陣列) |
| array_splice | 切片並從原陣列移除(可替換) |
| array_chunk | 等長分塊(如每 3 筆一組) |