深入浅析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 相关文章推荐
PHP截取中文字符串的问题
Jul 12 PHP
PHP获取数组中某元素的位置及array_keys函数应用
Jan 29 PHP
ajax取消挂起请求的处理方法
Mar 18 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
php获取客户端电脑屏幕参数的方法
Jan 09 PHP
golang与PHP输出excel示例
Jul 22 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
Sep 30 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
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
Yii2实现UploadedFile上传文件示例
2017/02/15 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
基于axios封装fetch方法及调用实例
2018/02/05 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
vue-cli脚手架搭建的项目去除eslint验证的方法
2018/09/29 Javascript
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
Django如何自定义分页
2018/09/25 Python
Python3爬虫全国地址信息
2019/01/05 Python
Python中import导入不同目录的模块方法详解
2020/02/18 Python
Python 没有main函数的原因
2020/07/10 Python
python如何实时获取tcpdump输出
2020/09/16 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
体育专业个人的求职信范文
2013/09/21 职场文书
零件设计自荐信范文
2013/11/27 职场文书
新学期决心书
2014/03/11 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
如何制定一份可行的计划!
2019/06/21 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Python多线程 Queue 模块常见用法
2021/07/04 Python