关于php unset对json_encode的影响详解


Posted in PHP onNovember 14, 2018

前言

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则是关联数组(非连续数组)

再看一个官方的例子:

关于php unset对json_encode的影响详解

以上输出的结果是:

关于php unset对json_encode的影响详解

注意:上面的第二个数组之所以转化后变成对象,是因为键值不是从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就可以完美的转换为数组而不是对象了

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP小技巧搜集,每个PHPer都来露一手
Jan 02 PHP
PHP5中的this,self和parent关键字详解教程
Mar 19 PHP
php获取mysql版本的几种方法小结
Mar 25 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
使用YUI+Ant 实现JS CSS压缩
Sep 02 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
Oct 31 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 #PHP
python进程与线程小结实例分析
Nov 11 #PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 #PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 #PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
Nov 10 #PHP
safari下载文件自动加了html后缀问题
Nov 09 #PHP
centos7上编译安装php7以php-fpm方式连接apache
Nov 08 #PHP
You might like
php 数组的指针操作实现代码
2011/02/08 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
javascript实现焦点滚动图效果 具体方法
2013/06/24 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
在ABP框架中使用BootstrapTable组件的方法
2017/07/31 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
Python简单I/O操作示例
2019/03/18 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
python 密码学示例——理解哈希(Hash)算法
2020/09/21 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
学校安全检查制度
2014/01/27 职场文书
个人自我剖析材料
2014/02/07 职场文书
护理中职生求职信范文
2014/02/24 职场文书
宣传保护环境的公益广告词
2014/03/13 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书