
本文旨在指导开发者如何在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编码并没有满足以下两点要求:
数据结构变化: 期望的是一个二维数组,内部数组只包含值,而不是键值对。数据类型转换: date_issued 需要转换为Unix时间戳(通常是毫秒级),grand_total 需要转换为浮点数。
数据重构与类型转换
为了达到期望的JSON格式,我们需要在json_encode之前对数据进行手动处理。核心思想是遍历原始数据,针对每个字段进行必要的类型转换,并构建一个新的嵌套数组结构。
以下是实现这一转换的PHP代码:
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); }}
代码解析:
$temp = [];: 初始化一个空数组,用于存放最终重构的数据。外层 foreach ($invoices as $key1 => $value1): 遍历从模型中获取的每一条发票记录。$value1 在这里代表单条发票的关联数组,例如 [‘date_issued’ => ‘2021-03-01’, ‘grand_total’ => ‘972.948’]。$row_data = [];: 在处理每条发票记录之前,初始化一个空数组来存储该记录转换后的 [时间戳, 金额] 对。内层 foreach ($value1 as $key2 => $value2): 遍历当前发票记录的各个字段。switch ($key2): 根据字段名进行条件判断和处理。case ‘date_issued’: 使用 strtotime($value2) 将日期字符串转换为Unix时间戳(秒)。由于前端可能需要毫秒级时间戳,这里乘以 1000。case ‘grand_total’: 使用 floatval($value2) 将字符串形式的总金额转换为浮点数。default: 对于其他不需要包含在最终JSON中的字段,可以忽略。$row_data[] = …: 将转换后的值依次添加到 $row_data 数组中,这样就形成了 [时间戳, 金额] 的结构。$temp[] = $row_data;: 将处理好的 $row_data (即 [时间戳, 金额] 数组)添加到 $temp 数组中,从而构建出 [[时间戳1, 金额1], [时间戳2, 金额2]] 的二维数组结构。$response[‘price’] = $temp;: 将重构后的 $temp 数组赋值给 $response 的 price 键。header(‘Content-Type: application/json’);: 确保浏览器或客户端正确解析响应内容为JSON。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中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1324231.html
微信扫一扫
支付宝扫一扫