CodeIgniter数据JSON数组转换指南

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);

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

{"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代码示例:

 '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?>

代码解释:

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1323839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月12日 10:34:24
下一篇 2025年12月12日 10:34:35

相关推荐

  • 在Laravel中高效处理前端JS数组:实现批量数据更新的教程

    本文详细介绍了如何在laravel应用中,通过javascript的fetch api将前端收集到的数组(如选中的id列表)安全、高效地传递给后端控制器,并利用laravel的数据库查询构建器实现批量数据更新。重点讲解了http方法选择、请求体处理、后端数据验证、以及使用`wherein`进行优化的…

    好文分享 2025年12月12日
    000
  • 使用PHP正则表达式从@提及字符串中提取特定标识符

    本教程旨在详细指导如何利用php正则表达式从包含`@[名称 (#id)](client:id)`格式的复杂文本中,高效且精确地提取出`client:id`形式的特定标识符。文章将深入解析所用正则表达式的每个组成部分,并提供完整的php代码示例,帮助读者掌握如何在实际应用中实现这一数据提取任务,从而避…

    2025年12月12日
    000
  • 优化PHP页面资源加载:按需引入CSS与JS的最佳实践

    本文探讨了在php项目中如何高效管理和按需引入css和javascript资源,以避免加载不必要的代码,从而提升页面性能和用户体验。通过构建一个集中式的资源注册表和动态引入函数,开发者可以精确控制每个页面所需的样式和脚本,有效优化缓存管理并降低页面开销。 在构建PHP Web应用程序时,常见的做法是…

    2025年12月12日
    000
  • Laravel请求参数类型识别与处理:从字符串到准确数据类型转换

    laravel中,url查询参数或请求体中的数据默认作为字符串接收。本文将探讨为何即使输入数字,php也会将其视为字符串,并提供实用的解决方案,通过`is_numeric()`结合类型转换,准确判断并处理请求参数是整数、浮点数还是纯字符串,确保业务逻辑基于正确的数据类型执行。 理解Laravel请求…

    2025年12月12日
    000
  • 如何使用SQL和PHP判断数据库中是否存在表

    本教程详细阐述了如何通过sql命令和php编程语言来检查指定数据库中是否包含任何数据表。核心方法是利用sql的`show tables`语句,并结合php的数据库操作(如pdo)来执行查询,然后根据查询结果判断数据库的表结构状态,从而实现条件性逻辑处理。 在许多Web应用或数据库管理任务中,我们经常…

    2025年12月12日 好文分享
    000
  • Laravel 8:实现路由多重认证(OR逻辑)的正确姿势

    本文旨在解决laravel路由配置中实现多重认证“或”逻辑的常见问题。当开发者希望用户能通过多种认证方式(如sanctum或basic认证)中的任意一种访问资源时,直接将多个认证中间件链式调用会导致“与”逻辑。正确的解决方案是利用laravel的认证守卫(guards)机制,通过在路由中间件中指定多…

    2025年12月12日
    000
  • Active Directory用户组检索:PHP与LDAP实践与优化

    在php中通过ldap检索active directory(ad)用户所属组是一个常见需求。本文将深入探讨使用`member`属性进行子字符串过滤失败的原因——ad默认不为`member`属性建立索引。我们将重点介绍更高效、性能更优的替代方案:利用ad的`memberof`属性直接查询用户所属组,并…

    2025年12月12日
    000
  • 使用 PHP 创建用户自定义函数结合 str_replace 和 ucfirst

    本文将指导你如何创建一个自定义 PHP 函数,该函数能够结合 `str_replace` 和 `ucfirst` 两个内置函数,实现字符串替换后首字母大写的功能。通过本文,你将学会如何定义函数、传递参数,以及在函数内部调用其他函数,从而实现更复杂的功能需求。 在 PHP 中,我们经常需要对字符串进行…

    2025年12月12日
    000
  • PHP正则表达式:从提及格式字符串中提取特定标识符

    本教程详细介绍了如何在php中使用正则表达式,从包含 `@` 提及格式的复杂字符串中高效提取特定的标识符,例如 `client:6`。通过逐步解析正则表达式的每个组成部分,并提供完整的php代码示例,帮助开发者掌握此类模式匹配技巧。 在构建现代Web应用时,尤其是涉及用户互动的功能,如提及(@men…

    2025年12月12日
    000
  • 解决mPDF中绝对定位HTML内容字体大小不生效的策略

    在使用mpdf生成pdf时,若html内容中的div元素采用position: absolute定位并设置了固定的width和height,其内部的font-size样式可能无法按预期生效。mpdf会尝试自动调整字体大小以适应容器,导致字体尺寸受限。核心解决方案是,当需要特定的字体大小时,必须相应地…

    2025年12月12日
    000
  • 使用PHP fmod函数判断数字类型:小数或整数

    本文详细介绍了如何在php中利用`fmod()`函数高效准确地判断一个给定数字是小数还是整数。通过计算数字除以1的余数,可以轻松区分具有非零小数部分的数字和纯整数。教程提供了清晰的代码示例、详细的函数解释,并探讨了如何处理字符串输入以及在特定场景下对“10.00”等数值的特殊判断需求。 在开发过程中…

    2025年12月12日
    000
  • 实现基于JavaScript可用性的PHP内容动态加载策略

    本文探讨了在php中根据客户端javascript可用性加载不同内容的有效策略。由于php在服务器端执行,无法直接感知客户端js状态,因此传统的` `标签内嵌php逻辑无效。文章提出并详细阐述了利用“结合`meta http-equiv=”refresh”`进行客…

    2025年12月12日
    000
  • 如何优雅地将 MySQL 数据在 HTML 页面中展示

    本文旨在提供一个清晰、简洁的教程,指导开发者如何使用 PHP 从 MySQL 数据库中检索数据,并将其以美观的 HTML 表格形式呈现于网页上。我们将探讨如何建立数据库连接、执行查询、处理结果集,以及最终将数据格式化并插入到 HTML 表格中,同时注重代码的可读性和资源效率。 连接数据库 首先,我们…

    2025年12月12日
    000
  • 基于模态框点击展示不同数据的教程

    本文旨在解决在循环生成的表格中,点击每一行数据对应的链接,弹出模态框并显示该行特定数据的需求。通过 JavaScript 编程方式控制模态框的显示,并动态加载/替换模态框中的数据,实现每个模态框展示对应数据的详细信息。本文提供详细的步骤和代码示例,帮助开发者快速实现此功能。 问题分析 原始代码存在的…

    2025年12月12日
    000
  • CodeIgniter数据重塑:将数据库结果转换为前端友好的JSON数组

    本教程详细指导如何在codeigniter框架中,将从数据库获取的原始数据(如包含日期和总额的对象数组)转换为特定的嵌套json数组格式。通过数据预处理,包括日期到unix时间戳(毫秒)的转换和字符串到浮点数的转换,确保api输出符合前端(如图表库)的严格要求,从而实现灵活且精确的数据呈现。 在构建…

    2025年12月12日
    000
  • 如何优雅地在网页上展示从MySQL数据库获取的数据

    本文旨在提供一种简洁高效的方法,将从MySQL数据库检索的数据以清晰美观的HTML表格形式呈现在网页上。通过使用PDO连接数据库,并结合PHP的字符串格式化功能,可以避免复杂的迭代器操作,从而提高代码的可读性和执行效率。本文将提供详细的代码示例和步骤,帮助开发者快速实现数据展示功能。 使用PDO和字…

    2025年12月12日
    000
  • PHP动态路径删除stdClass对象嵌套属性的正确实践

    本文深入探讨了在php中通过动态路径删除`stdclass`对象深度嵌套属性的挑战与解决方案。针对直接对指向嵌套属性的引用变量使用`unset`无法生效的问题,文章提出了一种有效策略:首先解析路径以定位到目标属性的直接父级对象,然后利用`unset`操作符在父级对象上精确移除目标子属性,从而实现动态…

    2025年12月12日
    000
  • 深入理解API Platform中的资源嵌套与序列化组:解决IRI返回问题

    本文深入探讨了symfony api platform中,即使正确配置了序列化组(groups)注解,关联实体仍以iri(国际化资源标识符)形式而非完整对象返回的常见问题。通过分析`normalizationcontext`与`@groups`注解的工作机制,本文将揭示导致此行为的根源,并提供两种有…

    2025年12月12日
    000
  • 使用PHP正则表达式从复杂字符串中提取特定标识符

    本教程将指导您如何利用php正则表达式从包含特定格式(如`@[名称 (#id)](client:n)`)的文本中高效提取`client:n`这类标识符。我们将详细解析正则表达式的构成,特别是`k`操作符的应用,并提供完整的php代码示例,帮助您实现精确的数据抽取。 在开发提及(mention)系统时…

    2025年12月12日
    000
  • 使用 PHP 从 Active Directory 获取用户组信息

    本文介绍了如何使用 php 从 active directory (ad) 中检索用户所属的组。重点讲解了使用 `memberof` 属性进行高效查询的方法,并解释了 `member` 属性查询的限制以及 active directory 中属性索引的重要性。同时提供了示例代码,帮助开发者快速实现用…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信