
本文详细介绍了在codeigniter框架中,如何将从数据库获取的关联数组数据,通过编程转换成前端所需的特定嵌套json数组格式。核心在于对原始数据进行迭代处理,将日期字符串转换为unix时间戳,并将数字字符串转换为浮点数,最终构建出符合目标结构的数组,再进行json编码输出。
在Web开发中,我们经常需要将后端获取的数据以特定的JSON格式返回给前端。CodeIgniter作为一款流行的PHP框架,其数据处理和输出能力强大,但有时数据库返回的原始数据结构与前端期望的JSON结构并不完全一致,尤其是在涉及数据类型转换和数组嵌套时。本文将探讨如何将一个包含日期和总金额的关联数组,转换成一个嵌套的、包含Unix时间戳和浮点数值的JSON数组。
理解问题:原始数据与目标格式的差异
假设我们从CodeIgniter的模型中获取到如下形式的关联数组数据,通常这是数据库查询结果的直接映射:
// $invoices 变量的示例内容[ [ "date_issued" => "2021-03-01", "grand_total" => "972.948" ], [ "date_issued" => "2021-03-12", "grand_total" => "1025.88" ]]
当直接使用 json_encode($invoices) 并将其赋值给一个键(例如 price)时,我们得到的是:
{"price":[{"date_issued":"2021-03-01","grand_total":"972.948"},{"date_issued":"2021-03-12","grand_total":"1025.88"}]}
然而,前端可能期望的格式是这样的,它是一个嵌套数组,其中每个内部数组包含一个Unix时间戳(毫秒级)和一个浮点数:
{ "price": [ [ 1483275269000, // Unix时间戳,通常是秒级,这里示例是毫秒级 972.948 ], [ 1483361668000, 1025.88 ] ]}
显而易见,主要差异在于:
原始数据是关联数组,目标是索引数组(嵌套)。date_issued 是日期字符串,目标是Unix时间戳(数字)。grand_total 是字符串形式的数字,目标是浮点数。
解决方案:数据转换与重构
要实现这种转换,我们需要对从模型获取的原始数据进行迭代处理,并根据目标格式重构数据。以下是在CodeIgniter控制器中实现此转换的步骤和示例代码:
首先,从模型获取原始数据:
$invoices = $this->invoice_model->getAllData2(logged('company_id'));
接下来,对 $invoices 数组进行遍历和转换:
$temp = []; // 初始化一个临时数组,用于存储转换后的数据foreach($invoices as $key1 => $value1) { // 对于每个发票记录(例如 $value1 = ["date_issued" => "...", "grand_total" => "..."]) foreach($value1 as $key2 => $value2) { switch($key2) { case 'date_issued': // 将日期字符串转换为Unix时间戳。 // strtotime() 返回的是秒级时间戳,如果前端需要毫秒级,需要乘以1000。 $temp[$key1][] = strtotime($value2) * 1000; // 乘以1000转换为毫秒 break; case 'grand_total': // 将字符串形式的数字转换为浮点数。 $temp[$key1][] = floatval($value2); break; default: // 如果有其他字段不需要转换或需要保留,可以在这里处理。 // 对于本例,我们只关心这两个字段。 break; } }}// 将转换后的数据赋值给响应数组的 'price' 键$response['price'] = $temp;// 使用 json_encode 输出JSON。TRUE 参数在旧版CodeIgniter中可能用于美化输出,// 但在PHP的json_encode函数中,第二个参数是选项位掩码,通常用于JSON_PRETTY_PRINT等。// 直接使用 json_encode($response) 即可。echo json_encode($response);
完整控制器代码示例
将上述逻辑整合到CodeIgniter的控制器方法中,可能看起来像这样:
load->model('invoice_model'); // 确保加载了你的模型 } public function getInvoicePrices() { // 假设 logged('company_id') 获取当前登录用户的公司ID $companyId = logged('company_id'); // 从模型获取原始发票数据 $invoices = $this->invoice_model->getAllData2($companyId); $temp = []; // 初始化临时数组 // 遍历原始数据并进行转换 foreach($invoices as $invoice) { $timestamp = strtotime($invoice['date_issued']) * 1000; // 转换为毫秒级时间戳 $grandTotal = floatval($invoice['grand_total']); // 转换为浮点数 // 构建新的嵌套数组元素 $temp[] = [$timestamp, $grandTotal]; } // 将转换后的数据赋值给响应数组 $response['price'] = $temp; // 设置响应头为JSON $this->output ->set_content_type('application/json') ->set_output(json_encode($response)); }}
注意事项:
时间戳精度: strtotime() 函数返回的是Unix时间戳(秒)。如果前端期望的是毫秒级时间戳,请务必将其乘以 1000。数据类型转换: floatval() 和 strtotime() 是PHP中进行数据类型转换的常用函数。确保原始数据格式与这些函数的预期输入兼容。错误处理: 在实际应用中,应考虑对 strtotime() 可能返回 false(无效日期)的情况进行处理,以避免生成不正确的数据。优化循环: 上述示例中的嵌套 foreach 循环和 switch 语句是有效的,但如果字段数量固定且已知,可以直接访问字段名,如第二个完整示例所示,这通常更简洁高效。CodeIgniter输出: 使用 $this->output->set_content_type(‘application/json’)->set_output(json_encode($response)); 是CodeIgniter推荐的输出JSON的方式,它会自动设置正确的HTTP头。
总结
将后端数据转换为前端所需的特定JSON格式是常见的开发任务。通过对原始数据进行迭代处理、精确的数据类型转换(如日期到时间戳、字符串到浮点数)以及数组结构的重构,我们可以灵活地满足各种前端需求。理解原始数据和目标格式之间的差异,并选择合适的PHP函数进行转换,是实现这一目标的关键。
以上就是CodeIgniter中将关联数组转换为特定格式的JSON数组的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1323956.html
微信扫一扫
支付宝扫一扫