Blogger Information
Blog 128
fans 9
comment 5
visits 240781
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
php输出数组变成了对象?php数组转化成json的数据格式不是数组套对象而是对象套对象
 一纸荒凉* Armani
Original
3249 people have browsed it

php输出数组变成了对象?

php数组转化成json的数据格式不是数组套对象而是对象套对象是怎么回事?
php为什么打印时是数组格式,但是转json格式以后存入数据库就成了对象形式?

问题如下:

  1. 如果是api返回给前端的json数据,你需要保证的你的数组索引是连续的数字索引,需要使用array_values
  2. 如果是PHP关联数组在JSON化时会出现数据类型变成对象的情况
  1. $arr = array('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
  2. echo json_encode($arr);

输出:{“a”:1,”b”:2,”c”:3,”d”:4,”e”:5}

此时数组格式的数据被转换成了对象类型

如果是索引数组或者空数组,则输出为数组形式。


另一种情况是虽然是索引数组,但依然有时候会被转换成对象形式,这就邪门了,这是在菜单权限勾选时候踩的坑,如果我们连续勾选权限例如第一项第二项第三项,但是如果跳过一下,这样返回后台接口的数据,就是一个索引不连续的数组,这时候会被转换成对象形式,然后在获取的时候,造成了数据不统一从而报错。

所有后端需要给传递过来的数组sort重新排序一下或者只取出键或者值部分,这样生成新的数组就是连续的键值对。json之后依然保持数组的形态的字符串。

如果是api返回给前端的json数据,你需要保证的你的数组索引是连续的数字索引,需要使用array_values。如果需要的内容在键中也可以使用array_keys


下面来详细介绍一下为什么会出现这种情况?

数组”(array)和“对象”(object)两者都可以用来表示数据的集合

比如有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3:4},然后你运行alert(a[1]),两种情况下的运行结果是相同的!这就是说,数据集合既可以用数组表示,也可以用对象表示,那么我到底该用哪一种呢?数组表示有序数据的集合,而对象表示无序数据的集合。如果数据的顺序很重要,就用数组,否则就用对象。

当然,数组和对象的另一个区别是,数组中的数据没有“名称”(name),对象中的数据有“名称”(name)。但是问题是,很多编程语言中,都有一种叫做“关联数组”(associative array)的东西。这种数组中的数据是有名称的。

比如在JavaScript中,可以这样定义一个对象:
var a={"城市":"北京","面积":16800,"人口":1600};

但是,也可以定义成一个关联数组:

  1. a["城市"]="北京";
  2. a["面积"]=16800;
  3. a["人口"]=1600;

在Javascript语言中,关联数组就是对象,对象就是关联数组。这一点与PHP语言完全不同,在php中,关联数组也是数组。
比如运行下面这段javascript:

  1. var a=[1,2,3,4];
  2. a['foo']='Hello World';
  3. alert(a.length);

最后的结果是4,也就是说,数组a的元素个数是4个。
但是,运行同样内容的php代码就不一样了:

  1. $a=array(1,2,3,4);
  2. $a["foo"]="Hello world";
  3. echo count($a);

最后的结果是5,也就是说,数组a的元素个数是5个。

所以在处理数据给前端的时候,多数情况会出现数组跟对象的集合体,如果前端对数据有要求,就得进行相应的修改。

总结:如果我们就是准备存储可以说明性的键值对数据,json转换之后就是对象形式,但如果我们只是单存想存储数组形式字符串,这要注意索引的顺序是否连续,因为json之后为了保持数据的状态,他会给你数组转换为json对象形式存储。对象名称是你的数组键,但是连续的索引的时候,无需保持这种状态,则JSON转换之后为数组字符串。这一点需要注意,你最终想转换为什么形式的JSON字符串好一致性处理。

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post