关于php unset对json_encode的影响详解
前言
PHP 中有个释放变量的语句叫做unset(从PHP4开始unset已经不再是一个函数了,而是一个语句),本文主要给大家介绍了关于php unset对json_encode影响的相关内容,下面话不多说了,来一起看看详细的介绍吧
先运行一段php代码:
$a = Array(0= 'hello world', 1= 'girl', 2= 'boy');
var_dump(json_encode($a));
unset($a[1]);
var_dump(json_encode($a));
返回结果如下:
string(28) “[“hello world”,”girl”,”boy”]” string(29) “{“0″:”hello world”,”2″:”boy”}”
发现对一个数组unset前后,变量的类型变化了,unset前是数组,unset后是对象
这是为什么呢?
看下unset和json_encode究竟是做了什么:
unset() 销毁指定的变量。可以删除数组的指定元素,删除后索引不重排。
?json_encode() 用于对变量进行 JSON 编码,该函数如果执行成功返回 JSON 数据,否则返回 FALSE
而json_encode转换的对象如果是数组,那么就需要注意下了,看下面的示例:
举例:
$a = Array(0= 'hello world', 1= 'girl', 2= 'boy');
var_dump(json_encode($a));
$b = Array('name'= 'hello world', 'age'= '18', 'gender'= 'man');
var_dump(json_encode($b));
运算结果:
string(28) “[“hello world”,”girl”,”boy”]” string(48) “{“name”:”hello world”,”age”:”18″,”gender”:”man”}”
发现上面的结果一个是数组,一个是对象。
这是因为a是索引数组(连续数组),b则是关联数组(非连续数组)
再看一个官方的例子:
以上输出的结果是:
注意:上面的第二个数组之所以转化后变成对象,是因为键值不是从0开始,这也是非连续数组
所以对一个连续数组执行unset后,会变成非连续数组,对非连续数组执行json_encode会变成对象。
总结:
php中:
索引数组:是指以数字为键的数组。并且这个键值 是自增的
关联数组:指的是一个键值对应一个值,并且这个键值是不规律的,通常都是我们自己指定的。
索引数组转为json后是数组。而关联数组转为json后是对象
拓展一:
那如果想对连续数组执行json_encode后变成对象可以这样做:
$arr = array(
'0'= 'a','1'= 'b','2'= 'c','3'= 'd'
);
echo json_encode((object)$arr);
输出结果为:
{“0″:”a”,”1″:”b”,”2″:”c”,”3″:”d”}
拓展二:
怎么消除unset对json_encode的影响?达到转换结果依然为数组
使用unset时:
foreach ($array as $k = $v) {
if (某条件) {
unset($array[$k]);
}
}
优化后:
$tmp = array();
foreach ($array as $k = $v) {
if (某条件)) {
continue;
}
$tmp[] = $v;
}
$array = $tmp;
对优化后的$array进行json_encode就可以完美的转换为数组而不是对象了
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对网站事(zalou.cn)的支持。
- Silverlight初级教程-开发工具
- WCF的Binding模型之五:绑定元素(Binding Element)
- 2018年物联网发展趋势
- Silverlight初级教程-概述
- WCF的Binding模型之四:信道工厂(Channel Factory)
- 如何做一个好的前端重构工程师
- 云计算是否真的对企业来说无所不能?
- 科协带你开个2017年科技世界的总结会!
- 基于StockRanker算法的机器学习量化策略
- Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架
- 交易费用过高的比特币还能成为“未来货币”吗?
- 应用大数据,做好技术成果市场价值评估
- Linux和Windows的换行符
- 行业数据重要性不用多说,呕心整理分享(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring Boot 集成 WebSocket 实现服务端推送消息到客户端
- OpenCV 绘制图形
- OpenCV 图片缩放
- AI树莓派——构建树莓派大脑(NCNN环境搭建)
- PC人脸识别登录,出乎意料的简单
- TensorLayer学习之简介与安装
- JVM系列之:String.intern的性能
- 神经网络架构搜索——可微分搜索(DARTS)
- 神经网络架构搜索——可微分搜索(P-DARTS)
- 神经网络架构搜索——可微分搜索(PC-DARTS)
- 反编译小程序记录
- 使用Selenium WebDriver,Python和Chrome编写您的第一个Web测试
- 神经网络架构搜索——可微分搜索(SGAS)
- 神经网络架构搜索——可微分搜索(Fair-DARTS)
- 一帧图像的Android之旅 :应用的首个绘制请求