CodeIgniter中定制化JSON数组输出格式的实现

心靈之曲
发布: 2025-10-15 12:13:21
原创
671人浏览过

CodeIgniter中定制化JSON数组输出格式的实现

本文旨在指导开发者如何在codeigniter框架中,将从数据库获取的关联数组数据,转换并重构为前端或api所需的特定嵌套json数组格式。通过详细的代码示例,演示如何处理日期字符串到unix时间戳的转换,以及数字字符串到浮点数的转换,最终生成符合要求的json输出,以满足复杂的数据结构需求。

在Web应用开发中,尤其是在构建API接口时,我们经常需要将后端数据以特定的JSON格式返回给前端。CodeIgniter框架通常通过模型从数据库获取数据,这些数据默认以关联数组或对象数组的形式存在。然而,前端或某些图表库可能需要更紧凑或特定结构的JSON数据,例如一个包含时间戳和数值的二维数组。

初始数据结构与默认JSON编码

假设我们从模型中获取了一组发票数据,其结构可能如下所示,其中包含 date_issued(日期字符串)和 grand_total(总金额字符串):

// 假设 $invoices 是从模型获取的数据
$invoices = [
    ['date_issued' => '2021-03-01', 'grand_total' => '972.948'],
    ['date_issued' => '2021-03-12', 'grand_total' => '1025.88']
];

// 直接使用 json_encode 进行编码
$response['price'] = $invoices;
echo json_encode($response, TRUE);
登录后复制

这段代码会生成以下JSON输出:

{"price":[{"date_issued":"2021-03-01","grand_total":"972.948"},{"date_issued":"2021-03-12","grand_total":"1025.88"}]}
登录后复制

然而,如果前端期望的格式是这样的:

{
  "price": [
    [
      1483275269000, // Unix时间戳 (毫秒)
      972.948
    ],
    [
      1483361668000,
      1025.88
    ]
  ]
}
登录后复制

我们可以看到,默认的JSON编码并没有满足以下两点要求:

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

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

ReportPlus数据报表中心小程序 0
查看详情 ReportPlus数据报表中心小程序
  1. 数据结构变化: 期望的是一个二维数组,内部数组只包含值,而不是键值对。
  2. 数据类型转换: date_issued 需要转换为Unix时间戳(通常是毫秒级),grand_total 需要转换为浮点数。

数据重构与类型转换

为了达到期望的JSON格式,我们需要在json_encode之前对数据进行手动处理。核心思想是遍历原始数据,针对每个字段进行必要的类型转换,并构建一个新的嵌套数组结构。

以下是实现这一转换的PHP代码:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Invoice extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('invoice_model'); // 假设已加载模型
    }

    public function get_price_data() {
        // 假设 logged('company_id') 获取当前公司ID
        $company_id = logged('company_id'); 
        $invoices = $this->invoice_model->getAllData2($company_id);

        $temp = []; // 用于存储转换后的数据

        foreach ($invoices as $key1 => $value1) {
            $row_data = []; // 存储当前记录的转换结果
            foreach ($value1 as $key2 => $value2) {
                switch ($key2) {
                    case 'date_issued':
                        // 将日期字符串转换为Unix时间戳(秒),然后乘以1000得到毫秒
                        // 注意:strtotime 返回的是秒级时间戳
                        $row_data[] = strtotime($value2) * 1000; 
                        break;
                    case 'grand_total':
                        // 将字符串转换为浮点数
                        $row_data[] = floatval($value2);
                        break;
                    default:
                        // 忽略其他不需要的字段,或者根据需要处理
                        break;
                }
            }
            // 将处理后的行数据添加到 $temp 数组中
            $temp[] = $row_data;
        }

        $response['price'] = $temp;
        // 使用 json_encode 编码最终结果,第二个参数 TRUE 用于美化输出(PHP 5.4+)
        // 如果不需要美化,可以省略 TRUE 或使用 JSON_PRETTY_PRINT 选项
        header('Content-Type: application/json'); // 设置响应头为JSON
        echo json_encode($response, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);
    }
}
登录后复制

代码解析:

  1. $temp = [];: 初始化一个空数组,用于存放最终重构的数据。
  2. 外层 foreach ($invoices as $key1 =youjiankuohaophpcn $value1): 遍历从模型中获取的每一条发票记录。$value1 在这里代表单条发票的关联数组,例如 ['date_issued' => '2021-03-01', 'grand_total' => '972.948']。
  3. $row_data = [];: 在处理每条发票记录之前,初始化一个空数组来存储该记录转换后的 [时间戳, 金额] 对。
  4. 内层 foreach ($value1 as $key2 => $value2): 遍历当前发票记录的各个字段。
  5. switch ($key2): 根据字段名进行条件判断和处理。
    • case 'date_issued': 使用 strtotime($value2) 将日期字符串转换为Unix时间戳(秒)。由于前端可能需要毫秒级时间戳,这里乘以 1000。
    • case 'grand_total': 使用 floatval($value2) 将字符串形式的总金额转换为浮点数。
    • default: 对于其他不需要包含在最终JSON中的字段,可以忽略。
  6. $row_data[] = ...: 将转换后的值依次添加到 $row_data 数组中,这样就形成了 [时间戳, 金额] 的结构。
  7. $temp[] = $row_data;: 将处理好的 $row_data (即 [时间戳, 金额] 数组)添加到 $temp 数组中,从而构建出 [[时间戳1, 金额1], [时间戳2, 金额2]] 的二维数组结构。
  8. $response['price'] = $temp;: 将重构后的 $temp 数组赋值给 $response 的 price 键。
  9. header('Content-Type: application/json');: 确保浏览器或客户端正确解析响应内容为JSON。
  10. echo json_encode($response, JSON_NUMERIC_CHECK | JSON_PRETTY_PRINT);:
    • JSON_NUMERIC_CHECK: 自动将数字字符串编码为JSON数字类型,而不是字符串。这对于确保 grand_total 即使在原始数据中是字符串也能被正确识别为数字非常有用。
    • JSON_PRETTY_PRINT: 使JSON输出格式化,更易读。在生产环境中,为了减少响应大小,通常会省略此选项。

注意事项与最佳实践

  • 数据类型匹配: 始终确保将数据转换为前端期望的精确类型(例如,整数、浮点数、布尔值)。PHP的 intval(), floatval(), boolval() 等函数非常有用。
  • 时间戳精度: strtotime() 返回的是秒级时间戳。如果前端需要毫秒级,务必乘以 1000。对于更精确的时间处理,可以考虑使用 DateTime 对象。
  • 错误处理: 在实际应用中,应考虑 strtotime() 可能返回 false 的情况(例如,无效的日期字符串),并进行相应的错误处理或默认值设置。
  • 性能考量: 对于非常大的数据集,频繁的循环和类型转换可能会影响性能。在这种情况下,可以考虑在数据库查询阶段就进行部分数据格式化(如果数据库支持),或者优化PHP代码逻辑。
  • 可读性与维护性: 尽管 switch 语句在此示例中有效,但如果字段转换逻辑变得复杂,可以考虑创建辅助函数或使用更具声明性的方式来处理数据转换。

总结

通过上述方法,我们成功地将CodeIgniter从数据库获取的关联数组数据,转换并重构为符合特定前端需求的嵌套JSON数组格式。这强调了在API开发中,对数据进行预处理和类型转换的重要性,以确保后端输出与前端消费接口之间的数据契合度。理解并掌握这种数据转换技巧,能让开发者在构建灵活且健壮的Web服务时更加得心应手。

以上就是CodeIgniter中定制化JSON数组输出格式的实现的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号