先运行一段 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 就可以完美的转换为数组而不是对象了
来源: https://www.cnblogs.com/saysmy/p/9957734.html