深入浅析php json 格式控制


Posted in PHP onDecember 24, 2015

关于 json 这个问题,陆陆续续有新手朋友找我问,比如为什么我输出的是 {"1":"item1","2":"item2","3":"item3"} 而不是 ["item1","item2","item3"]。

php数组 与 js数组

我这里用 php 5.4 以上语法表示。

php 里有关联数组和索引数组,例如:

<?php
// 索引数组
$arr = ['item1', 'item2', 'item3'];
// 关联数组
$arr = [
 'name' => '张三',
 'age' => '22',
];

而 js 里只有一种数组,那就是索引数组,也许你会说可以用 K/V 键值对形式模拟关联数组啊。

 K/V 键值对看起来像,但他没有任何数组特性,这里就不详细说明了。

而上面的 php 数组 json_encode 后得到的 json 格式分别是 ["item1","item2","item3"] 和 {"name":"\u5f20\u4e09","age":"22"}。这里的中文被转为 Unicode 了,如果你非要显示中文,php 5.4 之后支持 JSON_UNESCAPED_UNICODE 参数,json_encode($arr, JSON_UNESCAPED_UNICODE) 即可得到 {"name":"张三","age":"22"},不过非常不推荐这样写。

这里分别得到的是 js 下的 数组 和 对象 格式的 json 字符串,那为什么会生成这两种类型,或者说,什么情况会生成对象格式,什么情况会生成数组格式呢。

php 数组 输出格式控制

大致几种情况我都列出来了,直接看代码。

<?php
$arr = [ // 不是 0 开始,会输出对象
 1 => 'item1',
 2 => 'item2',
 3 => 'item3',
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"1":"item1","2":"item2","3":"item3"}
$arr = [ // 连续索引,输出数组
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
];
echo "输出数组: ", json_encode($arr), "\n";
// 输出数组: ["item1","item2","item3"]
$arr = [ // 连续索引,输出数组 
 'item1',
 'item2',
 'item3',
];
echo "输出数组: ", json_encode($arr), "\n";
// 输出数组: ["item1","item2","item3"]
$arr = [ // 索引不连续,输出对象
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
 5 => 'item5',
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"0":"item1","1":"item2","2":"item3","5":"item5"}
$arr = [ // 包含关联索引,一定输出对象
 0 => 'item1',
 1 => 'item2',
 2 => 'item3',
 'other' => '其他字段'
];
echo "输出对象: ", json_encode($arr), "\n";
// 输出对象: {"0":"item1","1":"item2","2":"item3","other":"\u5176\u4ed6\u5b57\u6bb5"}
// 关联数组 + 索引数组 实例
$arr = [ // 关联数组
 'other' => '其他字段',
 'count' => 3, // 数组个数
 'list' => [ // 索引数组
  'item1',
  'item2',
  'item3',
 ],
];
echo "对象+数组: ", json_encode($arr), "\n";
// 对象+数组: {"other":"\u5176\u4ed6\u5b57\u6bb5","count":3,"list":["item1","item2","item3"]}

其实第一种就是很多新手朋友经常遇到的问题。

 因为数据库读出来后他们喜欢把 id 当索引用,而数据库的 id 不是从 0 开始的,看下这个例子。

$arr = $User->where($where)->find(); // 读取数据
$list = [];
foreach($arr as $key => $val) { // 遍历数组
 $list[$key] = [
  'name' => $val['name'],
  'age' => $val['age'],
 ];
}
$list['count'] = count($arr); // 其他属性
echo json_encode($list); // 输出 json
// {"1":{"name":"zhangsan","age":22},"2":{"name":"lisi","age":25},"count":2}

而最后一种是比较常用的写法,自定义字段和数组一起用,来修改下刚才例子。

$arr = $User->where($where)->find(); // 读取数据
$list = [];
foreach($arr as $key => $val) { // 遍历数组
 $list['list'][] = [ // 修改这里
  'name' => $val['name'],
  'age' => $val['age'],
 ];
}
$list['count'] = count($arr); // 其他属性
echo json_encode($list); // 输出 json
// {"list":[{"name":"zhangsan","age":22},{"name":"lisi","age":25}],"count":2}

希望对大家学习php json 格式控制相关知识有所帮助。谢谢大家一直以来对三水点靠木网站的支持。

PHP 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)续二
Apr 03 PHP
php.ini中的php-5.2.0配置指令详解
Mar 27 PHP
php smarty函数扩展
Mar 15 PHP
php的一些小问题
Jul 03 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
php读取csv实现csv文件下载功能
Dec 18 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
php文件操作相关类实例
Jun 18 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
php-7.3.6 编译安装过程
Feb 11 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
Dec 24 #PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 #PHP
php采用session实现防止页面重复刷新
Dec 24 #PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 #PHP
分享PHP计算两个日期相差天数的代码
Dec 23 #PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 #PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 #PHP
You might like
php筛选不存在的图片资源
2015/04/28 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
JS实现类似百叶窗下拉菜单效果
2016/12/30 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
python中hashlib模块用法示例
2017/10/30 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python基础学习之如何对元组各个元素进行命名详解
2018/07/12 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
2018/11/06 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python如何快速生成时间戳
2020/07/21 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
党员干部三严三实心得体会
2014/10/13 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技