Пагинация по массиву в редисе
private function procKey($page, $per_page, $message)
{
$llen = Redis::connection()->llen("$message");
$res = [];
$res["per_page"] = intval($per_page);
$res["last_page"] = intval(ceil($llen / $per_page));
$res["total"] = $llen;
if (!$page && $llen % $per_page > 0) {
$page = $res["last_page"] > 1 ? $res["last_page"] - 1 : 1; // вдруг нет 2й страницы
$els = Redis::connection()->lrange("$message", -($page * $per_page + $llen % $per_page), -(($page - 1) * $per_page + 1));
} else {
$page = $page ?? $res["last_page"];
$els = Redis::connection()->lrange("$message", -($page * $per_page), -(($page - 1) * $per_page + 1));
}
foreach ($els as &$el) {
$el = json_decode($el);
}
$res["page"] = intval($page);
$res["data"] = array_reverse($els);
return $res;
}
Пагинация с рваной первой страницей
//
$page = $data["page"] ?? "1";
$per_page = 18;
$res = [];
$llen = $q->count();
$q->limit($page == "1" ? $per_page - 1 : $per_page);
$q->skip($page > 1 ? $per_page - 1 + ($per_page * ($page - 2)) : 0);
$res["per_page"] = $per_page;
$res["last_page"] = 1;
$sum = $per_page - 1;
while ($sum < $llen) {
$res["last_page"]++;
$sum += $per_page;
}
$res["total"] = $llen;
$res["current_page"] = intval($page);
$res["next_page_url"] = $res["last_page"] == $page ? null : "next";
$res["data"] = $q->get();
//