PHP实现JSON数据数组分页教程


PHP实现JSON数据数组分页教程

本文详细介绍了如何使用php对从json文件加载的数据进行高效分页处理。教程涵盖了json数据的正确解析、根据特定条件筛选数据,以及实现核心分页逻辑(包括当前页码、每页数量的计算与应用),并提供完整的代码示例,旨在帮助开发者在展示大量数据时优化用户体验和系统性能。

在现代Web应用中,处理和展示大量数据是常见的需求。当数据量过大时,一次性加载并显示所有内容不仅会影响页面加载速度,还会降低用户体验。分页是解决这一问题的有效策略,它允许我们将数据分成若干小块,按需加载和显示。本教程将以PHP为例,演示如何从JSON文件中读取数据,并实现一个灵活的数组分页系统。

1. JSON数据准备与解析

首先,我们需要一个包含待分页数据的JSON文件。确保您的JSON格式是有效的。以下是一个修正后的示例JSON结构,它包含多个博客文章条目:

{
  "blogs": {
    "1": {
      "slug": "blog/cfsdgfdgfd",
      "cover_image": "cfsdgfdgfd.jpg",
      "author": {
        "name": "dsfdsaf",
        "image": "fdsafas",
        "email": "fdsafsa"
      },
      "heading": "fdgdfg",
      "excerpt": "sdfdsfdsaf",
      "date_added": "2019-04-25T12:21:31+10:00",
      "date_modified": "2025-12-07T14:05:12+10:00",
      "visible": "1",
      "comments": "0",
      "status": "1"
    },
    "2": {
      "slug": "blog/hxgch",
      "cover_image": "fdghhfd.jpg",
      "author": {
        "name": "fdghf",
        "image": "zhd",
        "email": "kjhgk"
      },
      "heading": "kjhkhjg",
      "excerpt": "hgfdhfd",
      "date_added": "2019-05-09T13:31:04+10:00",
      "date_modified": "2025-12-07T11:40:49+10:00",
      "visible": "1",
      "comments": "0",
      "status": "1"
    }
    // ... 更多博客条目
  }
}

在PHP中,我们使用 file_get_contents() 读取JSON文件内容,然后使用 json_decode() 将其解析为PHP数据结构。为了方便操作,强烈建议将JSON解码为关联数组,这通过将 json_decode() 的第二个参数设置为 true 来实现:

$jsonFilePath = 'data/blogs.json'; // 替换为您的JSON文件路径
$fileData = file_get_contents($jsonFilePath);
$jsonData = json_decode($fileData, true);

// 检查JSON解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON解析错误: " . json_last_error_msg());
}

$allBlogs = $jsonData['blogs'];

2. 数据筛选与预处理

在对数据进行分页之前,通常需要根据特定条件筛选出需要显示的数据。例如,我们可能只希望显示 status 为 '1'、visible 为 '1' 且发布日期不晚于当前日期的文章。

$filteredBlogs = [];
foreach ($allBlogs as $blogId => $blog) {
    // 确保所有必要的键都存在
    if (isset($blog['status']) && isset($blog['visible']) && isset($blog['date_added'])) {
        // 筛选条件:状态为1,可见,发布日期不晚于当前日期
        if ($blog['status'] === '1' && $blog['visible'] === '1' && strtotime($blog['date_added']) <= time()) {
            $filteredBlogs[] = $blog;
        }
    }
}

// 可选:根据日期倒序排列,确保最新文章在前
usort($filteredBlogs, function($a, $b) {
    return strtotime($b['date_added']) - strtotime($a['date_added']);
});

经过筛选和排序后,$filteredBlogs 数组将只包含符合显示条件的文章,并且按照您希望的顺序排列。

3. 核心分页逻辑实现

现在,我们有了经过筛选的文章数组,可以开始实现分页逻辑。这主要涉及以下几个步骤:

  1. 获取当前页码。
  2. 定义每页显示的条目数。
  3. 计算总页数。
  4. 使用 array_slice() 从筛选后的数组中提取当前页的数据。
// 配置分页参数
$itemsPerPage = 30; // 每页显示30篇文章

// 获取当前页码,默认为第一页
$currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if ($currentPage < 1) {
    $currentPage = 1; // 确保页码不小于1
}

$totalItems = count($filteredBlogs); // 筛选后文章的总数
$totalPages = ceil($totalItems / $itemsPerPage); // 计算总页数

// 确保当前页码不超过总页数
if ($currentPage > $totalPages && $totalPages > 0) {
    $currentPage = $totalPages;
} elseif ($totalPages == 0) {
    $currentPage = 1; // 如果没有文章,也显示第一页(空内容)
}

// 计算当前页的起始索引
$startIndex = ($currentPage - 1) * $itemsPerPage;

// 从筛选后的文章数组中获取当前页的文章
$currentBlogs = array_slice($filteredBlogs, $startIndex, $itemsPerPage);

4. 渲染当前页文章

获取到 $currentBlogs 数组后,您可以遍历它来生成HTML内容,显示当前页的博客文章。

ReportPlus数据报表中心小程序 ReportPlus数据报表中心小程序

ReportPlust意在打造一套精美的数据报表模板,里面高度封装日历组件、表格组件、排行榜组件、条形进度条组件、文本块组件以及ucharts的多个图表组件,用户只需要按照虚拟数据的格式,传特定数据即可方便、快捷地打造出属于自己的报表页面。该小程序主要使用了ucharts和wyb-table两插件实现的数据报表功能。 特点使用的是uni-app中最受欢迎的图表uCharts插件完成图表展示,该插件

ReportPlus数据报表中心小程序 0 查看详情 ReportPlus数据报表中心小程序
// 遍历当前页的文章并输出HTML
if (!empty($currentBlogs)) {
    foreach ($currentBlogs as $blog) {
        // 提取文章数据
        $slug = htmlspecialchars(str_replace('blog/', '', $blog['slug']));
        $cover_image = htmlspecialchars($blog['cover_image']);
        $authorName = htmlspecialchars($blog['author']['name']);
        $authorImage = htmlspecialchars($blog['author']['image']);
        $heading = htmlspecialchars($blog['heading']);
        $excerpt = htmlspecialchars($blog['excerpt']);
        $dateAdded = date('d F Y', strtotime($blog['date_added']));
        $dateISO = date('c', strtotime($blog['date_added']));

        // 注意:{{domain}} 和 {{cdn}} 占位符需要替换为实际的域名和CDN地址
        // imageLoad 函数也需要您的实际实现
        echo '
            <article class="col-12 col-md-6 col-xl-4 mb-4" itemscope itemtype="https://schema.org/Article">
                <div class="blog-article" data-href="{{domain}}/' . $slug . '">
                    <link itemprop="image" href="{{cdn}}/uploads/' . $cover_image . '" />
                    <picture>
                        @@##@@
                    </picture>

                    <h3 itemprop="headline">' . $heading . '</h3>

                    <div class="d-flex align-items-center flex-wrap align-content-start mt-3">
                        <figure>
                            @@##@@
                        </figure>

                        <div class="author" itemprop="author">' . $authorName . '</div> <time itemprop="datePublished" datetime="' . $dateISO . '" class="date">' . $dateAdded . '</time>
                    </div>

                    <p>' . $excerpt . '</p>

                    <a href="{{domain}}/' . $slug . '" title="Read: ' . $heading . '" itemprop="url">Continue Reading <i class="icon-right-1"></i></a>
                </div>
            </article>
        ';
    }
} else {
    echo '<p>没有找到符合条件的文章。</p>';
}

5. 生成分页导航链接

为了让用户能够切换页面,我们需要生成分页导航链接。这通常包括“上一页”、“下一页”以及所有页码的列表。

// 生成分页导航
echo '<n* aria-label="Page n*igation example">';
echo '<ul class="pagination justify-content-center mt-4">';

// 上一页按钮
if ($currentPage > 1) {
    echo '<li class="page-item"><a class="page-link" href="?page=' . ($currentPage - 1) . '">上一页</a></li>';
} else {
    echo '<li class="page-item disabled"><span class="page-link">上一页</span></li>';
}

// 页码链接
for ($i = 1; $i <= $totalPages; $i++) {
    if ($i == $currentPage) {
        echo '<li class="page-item active"><span class="page-link">' . $i . '</span></li>';
    } else {
        echo '<li class="page-item"><a class="page-link" href="?page=' . $i . '">' . $i . '</a></li>';
    }
}

// 下一页按钮
if ($currentPage < $totalPages) {
    echo '<li class="page-item"><a class="page-link" href="?page=' . ($currentPage + 1) . '">下一页</a></li>';
} else {
    echo '<li class="page-item disabled"><span class="page-link">下一页</span></li>';
}

echo '</ul>';
echo '</n*>';

6. 完整代码示例

将以上所有代码片段整合,即可形成一个完整的分页系统。

<?php

// 1. JSON数据准备与解析
$jsonFilePath = 'data/blogs.json'; // 替换为您的JSON文件路径
$fileData = file_get_contents($jsonFilePath);
$jsonData = json_decode($fileData, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    die("JSON解析错误: " . json_last_error_msg());
}

$allBlogs = $jsonData['blogs'];

// 2. 数据筛选与预处理
$filteredBlogs = [];
foreach ($allBlogs as $blog) {
    if (isset($blog['status']) && isset($blog['visible']) && isset($blog['date_added'])) {
        if ($blog['status'] === '1' && $blog['visible'] === '1' && strtotime($blog['date_added']) <= time()) {
            $filteredBlogs[] = $blog;
        }
    }
}

// 可选:根据日期倒序排列
usort($filteredBlogs, function($a, $b) {
    return strtotime($b['date_added']) - strtotime($a['date_added']);
});

// 3. 核心分页逻辑实现
$itemsPerPage = 30; // 每页显示30篇文章

$currentPage = isset($_GET['page']) ? (int)$_GET['page'] : 1;
if ($currentPage < 1) {
    $currentPage = 1;
}

$totalItems = count($filteredBlogs);
$totalPages = ceil($totalItems / $itemsPerPage);

if ($currentPage > $totalPages && $totalPages > 0) {
    $currentPage = $totalPages;
} elseif ($totalPages == 0) {
    $currentPage = 1;
}

$startIndex = ($currentPage - 1) * $itemsPerPage;
$currentBlogs = array_slice($filteredBlogs, $startIndex, $itemsPerPage);

?>

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>博客文章分页</title>
    <!-- 引入您的CSS框架,例如Bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        .blog-article {
            border: 1px solid #eee;
            padding: 15px;
            margin-bottom: 15px;
            border-radius: 5px;
        }
        .blog-article img {
            max-width: 100%;
            height: auto;
            border-radius: 3px;
        }
        .author img {
            border-radius: 50%;
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <div class="container mt-5">
        <h1 class="mb-4">最新博客文章</h1>
        <div class="row">
            <?php
            // 4. 渲染当前页文章
            if (!empty($currentBlogs)) {
                foreach ($currentBlogs as $blog) {
                    $slug = htmlspecialchars(str_replace('blog/', '', $blog['slug']));
                    $cover_image = htmlspecialchars($blog['cover_image']);
                    $authorName = htmlspecialchars($blog['author']['name']);
                    $authorImage = htmlspecialchars($blog['author']['image']);
                    $heading = htmlspecialchars($blog['heading']);
                    $excerpt = htmlspecialchars($blog['excerpt']);
                    $dateAdded = date('d F Y', strtotime($blog['date_added']));
                    $dateISO = date('c', strtotime($blog['date_added']));

                    // 替换 {{domain}} 和 {{cdn}} 为实际值
                    $domain = "http://yourdomain.com"; // 您的域名
                    $cdn = "http://yourcdn.com";     // 您的CDN地址

                    // 假设 imageLoad 函数的简化版本,实际应根据您的项目实现
                    function imageLoad($path, $width, $height) {
                        return $path; // 实际项目中会进行图片处理
                    }

                    echo '
                        <article class="col-12 col-md-6 col-xl-4 mb-4" itemscope itemtype="https://schema.org/Article">
                            <div class="blog-article" data-href="' . $domain . '/' . $slug . '">
                                <link itemprop="image" href="' . $cdn . '/uploads/' . $cover_image . '" />
                                <picture>
                                    @@##@@
                                </picture>

                                <h3 itemprop="headline">' . $heading . '</h3>

                                <div class="d-flex align-items-center flex-wrap align-content-start mt-3">
                                    <figure>
                                        @@##@@
                                    </figure>

                                    <div class="author" itemprop="author">' . $authorName . '</div> <time itemprop="datePublished" datetime="' . $dateISO . '" class="date">' . $dateAdded . '</time>
                                </div>

                                <p>' . $excerpt . '</p>
' . $heading . 'Photo of ' . $authorName . '' . $heading . 'Photo of ' . $authorName . '

以上就是PHP实现JSON数据数组分页教程的详细内容,更多请关注php中文网其它相关文章!


# php  # html  # css  # 上一页  # 下一页  # 您的  # 分页  # lsp  # css框架  # .net  # cdn  # ai  # npm  # json  # bootstrap  # js  # 排列  # 抖音搜索排名中的关键词  # 广西网站排名推广  # 商务网站建设开发维护  # 宁波推广网站大全  # 唐山营销推广定制公司有哪些  # 营销推广案例文案模板  # 营销推广主要的方式包括  # 家居营销推广地址怎么填  # 厦门微信推广营销公司  # 南宁什么网站推广赚钱  # 多个  # 博客  # 加载  # 数据结构  # 当前页  # 每页 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《饿了么》拼好饭点外卖教程2025  PySimpleGUI中实现键盘按键与按钮事件绑定教程  《书耽》更换手机号方法  FullCalendar自定义按钮样式定制指南  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  铁路12306入口 铁路12306官网版入口登录网址  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  抖音评论无法发送如何修复 抖音评论功能操作指南  J*aScript与HTML元素交互:图片点击事件与链接处理教程  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  《全民k歌》音乐怎么下载到本地2025  C#解析并修改XML后保存 如何确保格式与编码的正确性  《咸鱼之王》新版孙坚技能解析  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  sf漫画官网登录入口直达_sf漫画官方正版网址  Mac hosts文件在哪里_Mac修改hosts文件详细教程  《雅迪智行》用手机开锁方法  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  Flexbox布局中Stencil组件宽度不显示问题解析与:host尺寸控制  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  《气泡星球》兑换码礼包大全  邦丰播放器频道搜索设置  海棠阅读登录教程_详细讲解海棠登录操作  魔法祈幻界兑换码礼包大全  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  纯CSS实现滚动时动态时间轴线条颜色填充效果  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  菜鸟驿站的取件码忘了怎么办 手机快速查询指南  CDR如何复制交互式填充色  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  汽车之家网页版免费登录_汽车之家官网首页直接进入  《顺丰同城骑士》查看我的技能方法  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  QQ邮箱注册地址 免费获取QQ邮箱账号  优化Leaflet弹出层图片显示:条件渲染策略  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  163邮箱网页版入口 163邮箱在线使用  青橙手机语音助手怎么唤醒_青橙手机语音助手设置与唤醒方法  《理想汽车》权限管理设置方法  如何自定义苹果手机铃声  电子白板帮助菜单使用指南  花生壳内网映射新方案  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  《环球网校》设置报考省市方法 

 2025-11-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.