Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP JSON格式化:避免多余数组括号,构建关联对象_创想鸟

PHP JSON格式化:避免多余数组括号,构建关联对象

PHP JSON格式化:避免多余数组括号,构建关联对象

本教程旨在解决PHP中json_encode函数在生成JSON数据时,特定字段出现多余数组括号的问题。通过修改PHP数组的构建方式,从索引数组的追加操作$data[‘data’][]改为直接向关联数组赋值$data[‘data’][$sy],可以有效地将JSON输出中的数组结构转换为期望的关联对象结构,从而实现更简洁、符合预期的JSON格式化。

问题描述:JSON结构中的意外数组

在php开发中,我们经常需要将php数组转换为json字符串,以便于前端或其他服务消费。然而,有时在构建复杂json结构时,可能会遇到输出结果中包含不必要的数组括号([])的情况,这与我们期望的关联对象结构({})不符。

考虑以下PHP代码片段,它尝试构建一个包含加密货币汇率数据的JSON结构:

 "BTC"],    ["symbol" => "ETH"],    // ... 更多数据];$data = array(    'base' => 'USD',    'alter' => 'ETH',    'data' => array() // 初始化一个空数组);foreach ($cryptos as $row) {    $sy = $row["symbol"];    // 原始代码:使用 [] 进行追加    $data['data'][] = array(       "$sy"  => [            "rate" => 1.552000000000000,            "min" => 1.0077600000000000,            "max" => 10.077600000000000,            "code" => $row["symbol"],            "dp" => 8        ],    );}echo "var fxCur = " . json_encode($data, JSON_PRETTY_PRINT);?>

运行上述代码,json_encode会生成如下JSON输出:

{   "base":"USD",   "alter":"ETH",   "data":[      {         "BTC":{            "rate": 1.552,            "min": 1.00776,            "max": 10.0776,            "code":"BTC",            "dp":8         }      },      {         "ETH":{            "rate": 1.552,            "min": 1.00776,            "max": 10.0776,            "code":"ETH",            "dp":8         }      }   ]}

可以看到,”data”字段的值是一个JSON数组(由[]包裹),其内部包含多个JSON对象,每个对象又只有一个键值对(例如{“BTC”: {…}})。然而,我们期望的结构是”data”字段直接是一个JSON对象,其中键是加密货币符号,值是其对应的详细信息,如下所示:

{   "base":"USD",   "alter":"ETH",   "data":{      "BTC":{          "rate": 1.552,          "min": 1.00776,          "max": 10.0776,         "code":"BTC",         "dp":8      },      "ETH":{          "rate": 1.552,          "min": 1.00776,          "max": 10.0776,         "code":"ETH",         "dp":8      }   }}

根源分析:PHP数组构建与JSON编码

问题的根源在于PHP中数组的构建方式以及json_encode函数对不同类型PHP数组的处理。

立即学习“PHP免费学习笔记(深入)”;

在原始代码中,这行:

$data['data'][] = array( "$sy"  => [...] );

使用了[]操作符。在PHP中,当对一个数组使用[]并赋值时,它会将新元素追加到数组的末尾,并自动分配一个递增的整数索引。这意味着$data[‘data’]会成为一个索引数组(或称作列表),其元素依次为:

[0] => [“BTC” => {…}][1] => [“ETH” => {…}]…

当json_encode处理一个PHP索引数组(即所有键都是连续的整数,从0开始)时,它会将其编码为JSON数组([])。如果数组中存在非整数键或非连续的整数键,json_encode则会将其编码为JSON对象({})。

因此,为了让”data”字段被编码为JSON对象而不是JSON数组,我们需要确保$data[‘data’]在PHP中是一个关联数组,即其键不是连续的整数索引。

解决方案:构建关联数组

要实现期望的JSON结构,我们需要将foreach循环内部的数组赋值方式从追加([])改为直接使用加密货币符号作为键进行赋值。

修改后的代码如下:

 "BTC"],    ["symbol" => "ETH"],    // ... 更多数据];$data = array(    'base' => 'USD',    'alter' => 'ETH',    'data' => array() // 初始化一个空数组);foreach ($cryptos as $row) {    $sy = $row["symbol"];    // 修正后的代码:直接使用 $sy 作为键进行赋值    $data['data'][$sy] = [        "rate" => 1.552000000000000,        "min" => 1.0077600000000000,        "max" => 10.077600000000000,        "code" => $row["symbol"],        "dp" => 8    ];}echo "var fxCur = " . json_encode($data, JSON_PRETTY_PRINT);?>

在这段修正后的代码中,关键的变化在于:

$data['data'][$sy] = [...];

这里,我们不再使用[]进行追加,而是直接将$sy(例如”BTC”、”ETH”)作为键,将右侧的详细信息数组作为值赋给$data[‘data’]。这样,$data[‘data’]在PHP中就成为了一个关联数组,其结构类似于:

$data['data'] = [    "BTC" => ["rate" => ..., "min" => ..., ...],    "ETH" => ["rate" => ..., "min" => ..., ...],    // ...];

当json_encode处理这种关联数组时,它会将其编码为JSON对象({}),从而得到我们期望的输出。

预期输出

使用修正后的代码,json_encode将生成如下符合预期的JSON输出:

{   "base":"USD",   "alter":"ETH",   "data":{      "BTC":{          "rate": 1.552,          "min": 1.00776,          "max": 10.0776,         "code":"BTC",         "dp":8      },      "ETH":{          "rate": 1.552,          "min": 1.00776,          "max": 10.0776,         "code":"ETH",         "dp":8      }   }}

可以看到,”data”字段现在是一个JSON对象,而不是数组,这正是我们想要的结果。

注意事项与最佳实践

理解PHP数组类型与JSON映射:

PHP索引数组 (List): 如果PHP数组的所有键都是连续的整数(从0开始),json_encode会将其转换为JSON数组 []。PHP关联数组 (Map/Dictionary): 如果PHP数组包含非整数键或非连续的整数键,json_encode会将其转换为JSON对象 {}。明确你想要在JSON中表示的是一个有序列表(JSON数组)还是一个键值对集合(JSON对象),然后相应地构建你的PHP数组。

数据结构设计: 在设计数据结构时,应提前考虑最终的JSON输出形式。如果需要通过一个动态的键来访问数据,那么JSON对象是更合适的选择。如果数据是一个无序或有序的项的集合,且通过索引访问,那么JSON数组更合适。

可读性: 使用JSON_PRETTY_PRINT选项(如示例所示)可以使输出的JSON字符串更具可读性,尤其是在开发和调试阶段。

总结

通过本教程,我们了解了在PHP中构建JSON数据时,如何避免json_encode生成不必要的数组括号。核心在于理解PHP中索引数组和关联数组的区别,并根据期望的JSON结构,灵活地选择合适的数组构建方式。当需要将PHP数组映射为JSON对象时,务必使用字符串键或非连续整数键来构建PHP数组,而不是简单地通过[]追加元素。掌握这一技巧,将有助于您生成更精确、更符合预期的JSON数据结构。

以上就是PHP JSON格式化:避免多余数组括号,构建关联对象的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
在Linux系统上安装和配置PHPCMS的步骤
上一篇 2025年12月11日 04:30:13
PHP中正确构建JSON对象:避免不必要的数组括号
下一篇 2025年12月11日 04:30:20

相关推荐

  • Java Collections.sort与Collections.reverse的使用区别

    Collections.sort用于排序,基于元素值比较,结果有序,默认升序,可自定义规则;2. Collections.reverse仅反转列表顺序,不比较元素,时间复杂度O(n);3. 两者功能不同,不可替代,按需选择使用。 Java 中 Collections.sort 和 Collectio…

    2026年9月21日
    200
  • 陈震透露劳斯莱斯事故原因:辅助驾驶是“元凶”

    知名汽车博主陈震,就其于10月3日驾驶劳斯莱斯闪灵发生交通事故一事,作出了最新的回应。在北京交警通报其负事故全部责任后,陈震于昨晚发文,透露了事故发生的核心原因,他坦言,是由于自己使用了车辆的辅助驾驶功能,并将其归咎于自己“对闪灵的辅助驾驶能力边界认知不够清晰”。 辅助驾驶“甩锅”,驾驶员永远是第一…

    2026年9月21日
    100
  • 长佩阅读如何自定义封面

    在长佩阅读中,设置自定义封面可以让你的书架更具个人风格。以下是具体操作步骤: 一、确认书籍是否支持自定义封面 并非所有书籍都开放自定义封面功能,你需要先进入书籍详情页查看是否存在“自定义封面”这一选项。若该按钮存在,则说明这本书允许用户更换封面。 二、准备合适的封面图片 选择一张你喜欢的图片作为新封…

    2026年9月21日
    100
  • MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能MySQL热点数据缓存策略_MySQL减少磁盘访问提升性能

    mysql热点数据缓存的核心在于将频繁访问的数据保留在内存中以减少磁盘i/o,提升查询速度并缓解数据库压力。1. innodb缓冲池是关键机制,需合理配置其大小(通常为服务器内存的70-80%)及实例数以优化性能;2. 应用层缓存如redis/memcached通过前置缓存逻辑减少对mysql的直接…

    2026年9月21日 • 用户投稿
    200
  • VSCode怎么更改解码方式_VSCode文件编码修改教程

    VSCode通过设置文件编码解决乱码问题,可手动选择“以不同编码重新打开”或“使用编码保存”,推荐统一使用UTF-8编码并启用files.autoGuessEncoding自动检测,避免编码错误。 VSCode更改解码方式主要通过设置文件编码来实现,以便正确显示文件内容。通常情况下,VSCode会自…

    2026年9月21日
    900
  • 如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程如何用Animoto制作AI营销视频?快速生成商业AI视频的教程

    Animoto通过模板与拖放功能,结合AI生成的文案和配音,帮助用户快速制作品牌统一、节奏合理、带明确CTA的高效营销视频,适用于多平台推广。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Animoto是一个非常适合快速制作AI营销视频的…

    2026年9月21日 • 用户投稿
    100
  • Java ConcurrentSkipListMap在并发场景下应用

    ConcurrentSkipListMap是基于跳跃表实现的线程安全有序映射,支持高并发读写与高效范围查询,适用于需排序的并发场景,如排行榜系统;相比ConcurrentHashMap,它提供有序性与导航操作,但插入查找为O(log n),内存开销较大,适合读多写少或需区间扫描的业务。 在高并发场景…

    2026年9月21日
    100
  • 如何使用Ribbet的AI功能裁剪图片?快速实现精准图像裁剪

    答案:Ribbet的AI裁剪功能可快速智能识别主体并推荐裁剪方案,支持手动微调与多种比例选择,结合亮度、色彩等编辑工具优化效果,适用于制作符合社交媒体尺寸要求的封面图,操作简便且大部分功能免费,适合追求效率的普通用户。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    500
  • 怎么全选VSCode多个光标_VSCode多光标操作与批量选择文本教程

    VSCode中高效创建多光标的方法包括:Alt+Click手动添加光标,适用于不规则位置;Ctrl+Alt+方向键垂直添加光标,适合连续多行操作;Ctrl+D逐个选择匹配项,精准控制选择范围;Ctrl+Shift+L一次性选择所有匹配项,实现全局批量修改。结合查找替换和列选择模式可进一步提升编辑效率…

    2026年9月21日
    100
  • 燕云十六声装备回收转流派技巧分享

    燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享燕云十六声装备回收转流派技巧分享

    燕云十六声中,装备是角色变强的关键所在!武器、防具、饰品各具特色,品质更是分为绿、蓝、紫、金四个等级。想要高效提升战力、不浪费培养资源?那就必须掌握装备回收技巧与流派转换策略。具体怎么操作?继续往下看,实用攻略全解析助你轻松上手! 燕云十六声装备回收与转流派技巧指南 一、装备和武学的区别要分清 新手…

    2026年9月21日 • 用户投稿
    200
  • 如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程

    如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程如何用SumoPaint的AI裁剪图片?快速完成智能图片裁剪教程

    答案:SumoPaint虽无AI裁剪功能,但可通过魔棒、套索工具精确选区,结合图层蒙版与羽化、反选等操作实现智能裁剪效果,最后按需导出PNG或JPG高质量文件。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 在SumoPaint中,虽然它不…

    2026年9月21日 • 用户投稿
    300
  • MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案

    MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案

    mysql的缓存机制主要包括innodb缓冲池、查询缓存和操作系统文件系统缓存等,其中innodb缓冲池是性能优化的核心。1. innodb缓冲池缓存表数据和索引页,减少磁盘i/o,提升读写效率;2. 查询缓存因失效频繁及锁竞争问题,在高并发场景下易成瓶颈,已在mysql 8.0中移除;3. 操作系…

    2026年9月21日 • 用户投稿
    200
  • 抖音托管商品要钱吗?新人适合橱窗托管吗

    随着抖音平台影响力的不断扩大,越来越多的商家将其视为拓展线上业务的重要渠道。其中,抖音托管商品作为一种新兴推广方式,逐渐受到商家关注。然而,关于“抖音托管商品是否收费”这一问题,仍存在诸多疑问。本文将围绕这一话题展开分析,帮助商家更好地了解相关机制。 一、抖音托管商品概述 抖音托管商品是指商家将商品…

    2026年9月21日
    100
  • MySQL的binlog格式有哪些类型_它们有什么区别和影响?

    MySQL的binlog格式有哪些类型_它们有什么区别和影响?MySQL的binlog格式有哪些类型_它们有什么区别和影响?MySQL的binlog格式有哪些类型_它们有什么区别和影响?MySQL的binlog格式有哪些类型_它们有什么区别和影响?

    mysql的binlog有三种格式:statement-based(sbl)、row-based(rbl)和mixed-based(mbl),它们分别记录sql语句、行变更和智能混合方式。1. sbl记录执行的sql,优点是日志小、可读性强,但存在不确定性导致主从不一致;2. rbl记录每行的具体变…

    2026年9月21日 • 用户投稿
    400
  • 怎么弄微信公众号_微信公众号注册与功能配置教程

    怎么弄微信公众号_微信公众号注册与功能配置教程怎么弄微信公众号_微信公众号注册与功能配置教程怎么弄微信公众号_微信公众号注册与功能配置教程怎么弄微信公众号_微信公众号注册与功能配置教程

    答案:注册微信公众号需先确定账号类型,订阅号适合内容发布,服务号侧重功能服务,个人注册仅能选订阅号,企业可选服务号并需认证;注册后需配置自定义菜单、自动回复和欢迎语以提升用户体验。 微信公众号的注册与功能配置,说到底,就是把你的内容或服务,通过微信这个巨大的平台,有效地触达目标用户。这过程不复杂,但…

    2026年9月21日 • 用户投稿
    200
  • 如何在Java中理解Java I/O与NIO机制

    传统I/O是阻塞式流模型,适用于低并发场景;NIO基于缓冲区与通道,支持非阻塞和多路复用,适合高并发网络应用,核心区别在于线程模型与资源利用率。 Java中的I/O(输入/输出)与NIO(New I/O)是处理数据读写的核心机制,理解它们的区别和使用场景对开发高性能应用至关重要。传统I/O基于流模型…

    2026年9月21日
    100
  • 如何限制Linux用户cron任务 /etc/cron.deny使用技巧

    如何限制Linux用户cron任务 /etc/cron.deny使用技巧如何限制Linux用户cron任务 /etc/cron.deny使用技巧如何限制Linux用户cron任务 /etc/cron.deny使用技巧如何限制Linux用户cron任务 /etc/cron.deny使用技巧

    要限制linux用户执行cron任务,可编辑/etc/cron.deny文件,每行添加一个需禁止的用户名,保存后立即生效;若需更细粒度控制,可使用pam_time模块;此外,还可通过sudoers文件、chroot环境、linux capabilities、apparmor或selinux等方法限制…

    2026年9月21日 • 用户投稿
    200
  • Linux目录结构学习常见问题汇总

    Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总

    Linux只有一个根目录,所有设备挂载于此,形成统一树状结构。根目录下各路径分工明确:/bin和/sbin分别存放用户与管理员命令;/etc集中配置文件;/home为用户家目录;/var存储日志等动态数据;/tmp用于临时文件;/usr存放系统程序,/usr/local供手动安装软件;/dev包含设…

    2026年9月21日 • 用户投稿
    200
  • 有趣的操作系统:文件IO和网络IO

    一、从i/o开始 在学习和使用计算机的过程中,i/o(输入/输出)是不可避免的一个概念,指的是操作、程序或设备与计算机之间发生的数据传输过程。 对于计算机来说,I/O操作和计算处理是其两大核心任务,其中大部分时间都用于执行I/O操作。I/O操作包括硬件和软件两部分,即I/O设备和I/O子系统。 I/…

    2026年9月21日
    100
  • Guava Multimap:高效获取并打印指定键的所有关联值

    guava multimap是处理一键多值映射关系的强大工具。要获取特定键的所有关联值,应直接使用其提供的`multimap#get(k)`方法。该方法会返回一个包含所有匹配值的`collection`,即使键不存在,也会返回一个空集合而非`null`,从而简化了值检索和空值处理逻辑,是比手动迭代键…

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信