0

0

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

花韻仙語

花韻仙語

发布时间:2025-07-08 20:22:14

|

584人浏览过

|

来源于php中文网

原创

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循环内部的数组赋值方式从追加([])改为直接使用加密货币符号作为键进行赋值。

修改后的代码如下:

奇布塔
奇布塔

基于AI生成技术的一站式有声绘本创作平台

下载
 "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对象,而不是数组,这正是我们想要的结果。

注意事项与最佳实践

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

    • PHP索引数组 (List): 如果PHP数组的所有键都是连续的整数(从0开始),json_encode会将其转换为JSON数组 []。
    • PHP关联数组 (Map/Dictionary): 如果PHP数组包含非整数键或非连续的整数键,json_encode会将其转换为JSON对象 {}。
    • 明确你想要在JSON中表示的是一个有序列表(JSON数组)还是一个键值对集合(JSON对象),然后相应地构建你的PHP数组。
  2. 数据结构设计: 在设计数据结构时,应提前考虑最终的JSON输出形式。如果需要通过一个动态的键来访问数据,那么JSON对象是更合适的选择。如果数据是一个无序或有序的项的集合,且通过索引访问,那么JSON数组更合适。

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

总结

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

74

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

1

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

PHP数字签名与加密解密
PHP数字签名与加密解密

共12课时 | 1.3万人学习

Codeigniter 3 中文开发手册
Codeigniter 3 中文开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号