
本教程旨在解决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);输出结果仍然会保留原始的键值对结构:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
{"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
?>代码解释:
当CodeIgniter(或其他PHP框架)需要返回特定格式的JSON数组,而直接json_encode无法满足需求时,关键在于在编码前对数据进行精细的预处理和类型转换。通过遍历原始数据,并针对每个字段应用适当的转换逻辑(如日期转时间戳、字符串转浮点数),我们可以精确地构建出符合任何复杂前端需求的JSON数据结构。这种方法虽然需要一些额外的代码,但提供了极大的灵活性和控制力,是构建健壮API的常用实践。
以上就是CodeIgniter数据JSON数组转换指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号