CodeIgniter数据JSON数组转换指南

花韻仙語
发布: 2025-10-14 10:07:01
原创
530人浏览过

CodeIgniter数据JSON数组转换指南

本教程旨在解决codeigniter中将数据库查询结果转换为特定json数组格式的问题,特别是将键值对数据(如日期和总金额)重塑为嵌套的时间戳-数值对数组。通过详细的数据后处理和类型转换示例,指导开发者如何灵活地构建符合前端需求的json数据结构,确保输出格式精确无误。

在CodeIgniter开发中,我们经常需要从数据库中获取数据并将其以JSON格式返回给前端。然而,直接对数据库查询结果进行json_encode操作,通常会生成一个由键值对对象组成的数组,这在许多情况下是期望的。但有时,前端或API消费者可能需要一种更为精简或特定结构的数据格式,例如一个由时间戳和数值组成的嵌套数组,而非包含字段名的对象。

问题描述与常见误区

假设我们从数据库中查询到了一系列发票数据,其原始结构可能类似于:

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

我们期望将其转换为如下的JSON格式:

{
  "price": [
    [1483275269000, 972.948],
    [1483361668000, 1025.88]
  ]
}
登录后复制

其中,date_issued被转换为Unix时间戳(通常是毫秒级,但在PHP中strtotime返回秒级,需要额外处理),grand_total被转换为浮点数。

如果直接尝试将查询结果赋值给一个数组元素并进行json_encode,例如:

$invoices = $this->invoice_model->getAllData2(logged('company_id'));
$response['price'] = $invoices;
echo json_encode($response);
登录后复制

输出结果仍然会保留原始的键值对结构:

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online
{"price":[{"date_issued":"2021-03-01","grand_total":"972.948"},{"date_issued":"2021-03-12","grand_total":"1025.88"}]}
登录后复制

这显然不符合我们的目标。问题在于json_encode函数会忠实地将PHP数组或对象转换为JSON结构,它不会自动进行深层的数据重塑或类型转换。因此,在编码之前,我们需要手动对数据进行预处理。

解决方案:数据预处理与类型转换

要实现所需的JSON结构,核心在于遍历原始数据,并根据目标格式对每个数据项进行转换和重塑。

以下是实现这一目标的PHP代码示例:

<?php
// 假设 $invoices 是从模型获取的原始数据
// 例如:
// $invoices = [
//     (object)['date_issued' => '2021-03-01', 'grand_total' => '972.948'],
//     (object)['date_issued' => '2021-03-12', 'grand_total' => '1025.88']
// ];
// 如果模型返回的是关联数组,则数据结构为:
// $invoices = [
//     ['date_issued' => '2021-03-01', 'grand_total' => '972.948'],
//     ['date_issued' => '2021-03-12', 'grand_total' => '1025.88']
// ];

// 从模型获取数据
$invoices = $this->invoice_model->getAllData2(logged('company_id'));

$temp = []; // 初始化一个临时数组,用于存放转换后的数据

foreach ($invoices as $key1 => $value1) {
    $row = []; // 为每个发票记录创建一个新的子数组
    foreach ($value1 as $key2 => $value2) {
        switch ($key2) {
            case 'date_issued':
                // 将日期字符串转换为Unix时间戳(秒),然后乘以1000得到毫秒
                // 注意:strtotime返回秒级时间戳,如果前端需要毫秒级,需乘以1000
                $row[] = strtotime($value2) * 1000;
                break;
            case 'grand_total':
                // 将总金额字符串转换为浮点数
                $row[] = floatval($value2);
                break;
            default:
                // 忽略其他不需要的字段
                break;
        }
    }
    $temp[] = $row; // 将处理后的行添加到临时数组中
}

$response['price'] = $temp; // 将转换后的数据赋值给响应数组的'price'键
echo json_encode($response); // 编码并输出JSON
?>
登录后复制

代码解释:

  1. $temp = [];: 创建一个空的数组$temp,它将用来存储最终转换后的数据。
  2. foreach ($invoices as $key1 =youjiankuohaophpcn $value1): 外层循环遍历从模型中获取的每一条发票记录。$value1在每次迭代中代表一个发票对象或关联数组(如['date_issued' => '...', 'grand_total' => '...'])。
  3. $row = [];: 在每次处理一个新的发票记录时,初始化一个空的$row数组。这个数组将存放当前发票记录转换后的时间戳和金额。
  4. foreach ($value1 as $key2 => $value2): 内层循环遍历当前发票记录($value1)的各个字段。$key2是字段名(如date_issued),$value2是字段值。
  5. switch ($key2): 根据字段名进行条件判断,执行不同的转换逻辑。
    • case 'date_issued':: 如果字段是date_issued,使用strtotime($value2)将日期字符串转换为Unix时间戳(以秒为单位)。由于许多前端库(如JavaScript的Date对象)习惯使用毫秒级时间戳,我们将其乘以1000以符合常见需求。然后,将这个时间戳添加到当前的$row数组中。
    • case 'grand_total':: 如果字段是grand_total,使用floatval($value2)将其转换为浮点数类型。这是为了确保JSON中的数值类型正确,避免以字符串形式传输数字。然后,将这个浮点数添加到$row数组中。
    • default:: 对于其他不需要的字段,可以选择忽略。
  6. $temp[] = $row;: 当一个发票记录的所有相关字段处理完毕后,将填充好的$row数组添加到$temp数组中。
  7. $response['price'] = $temp;: 将最终转换好的$temp数组赋值给$response数组的price键。
  8. echo json_encode($response);: 使用json_encode函数将$response数组转换为JSON字符串并输出。

注意事项与最佳实践

  • 数据类型转换的重要性:在JSON中,数字和字符串是不同的类型。数据库中取出的数字(特别是小数)有时会被视为字符串。使用floatval()、intval()等函数进行显式类型转换非常重要,以确保JSON输出的数值类型正确。
  • 时间戳单位:PHP的strtotime()函数返回的是秒级Unix时间戳。如果前端需要毫秒级时间戳,务必将其乘以1000。
  • 灵活性:这种数据预处理方法非常灵活,可以根据任何复杂的JSON结构需求进行定制。例如,如果需要将多个字段合并为一个字符串,或者进行更复杂的计算,都可以在foreach循环中实现。
  • 性能考量:对于非常大的数据集,这种逐条遍历和转换的方式可能会有性能开销。在这种情况下,可以考虑在数据库查询阶段就进行一定程度的格式化(例如使用SQL函数),或者在PHP中利用array_map等函数进行更简洁的转换。
  • 错误处理:在实际应用中,应考虑strtotime()等函数可能返回false的情况(例如,当日期字符串格式不正确时),并添加相应的错误处理逻辑。
  • json_encode选项:json_encode函数接受第二个参数作为选项位掩码,例如JSON_PRETTY_PRINT可以使输出的JSON更具可读性,方便调试。在生产环境中通常不使用,以减少传输大小。

总结

当CodeIgniter(或其他PHP框架)需要返回特定格式的JSON数组,而直接json_encode无法满足需求时,关键在于在编码前对数据进行精细的预处理和类型转换。通过遍历原始数据,并针对每个字段应用适当的转换逻辑(如日期转时间戳、字符串转浮点数),我们可以精确地构建出符合任何复杂前端需求的JSON数据结构。这种方法虽然需要一些额外的代码,但提供了极大的灵活性和控制力,是构建健壮API的常用实践。

以上就是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号