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就可以完美的转换为数组而不是对象了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术