php对象和数组的区别,php json_encode() 对象和数组区别, [] 和{}

PHP中将数组转变成Json

强大的PHP已经提供了内置函数:json_encode() 和 json_decode()。很容易理解,json_encode()就是将PHP数组转换成Json。相反,json_decode()就是将Json转换成PHP数组。

例如:

$array = array("name" => "Eric","age" => 23);

echo json_encode($array);

程序将打印出 : {"name":"Eric","age":23}

再看下面例子

$array = array(0 => "Eric", 1 => 23);

echo json_encode($array);

或者

$array = array('0' => "Eric", '1' => 23);

echo json_encode($array);

程序都将打印出 :["Eric",23]

若是空数组,则返回[]

$array = array();

echo json_encode($array);

程序将打印出 :[]

这个格式,在特定要求,比如APP,ios android端接收到数据时,偶尔[],偶尔{},会导致程序崩溃

以上例子可以看出,如果PHP数组的键都是数字或者空数组,那么json_encode()返回一个数组形式的Json,如果PHP数组的键全是字符串。那么json_encode()就会返回一个对象形式的Json。两者在js中的调用是不同的。

事实上,只要在PHP数组的键中有一个字符串形式的键,那么json_encode()就会返回对象形式的Json

一个对象,而对象是不可能以数字作为属性名的

解决方法,在返回值的地方,统一加格式转化 强制转换 对象类型 JSON_FORCE_OBJECT

$return_info = json_encode($info,JSON_UNESCAPED_UNICODE);

JSON_UNESCAPED_UNICODE,Json不要编码Unicode,也就是不转义中文

改为:

$return_info = json_encode($info,JSON_UNESCAPED_UNICODE|JSON_FORCE_OBJECT);

这应该有一定的危险,所有的本该是数组返回的数据,会都转换成对象

因此,稳妥点的办法,单独处理,把需要转换对象数字数字或空数组,强制转换类型Object,一般如果用在对接时,比较好,不管在什么情况,接口永远输出对象,空数据及为{},那么就能统一接口的数据形式,

但是这个参数不能轻易用,因为一旦用起来,会导致本该是数组的返回格式[],也会变成{}

比如

return (Object)[];

这样统一返回格式,{},而不是返回[]

同一个问题参考:

有关索引数组和关联数组

因此此问题关键核心在于,两种数组类型不一致,在特定的环境中,看具体需求json之后的结果,是数组,还是对象,最好统一格式,json操作,在接口中使用比较频繁,php和其他语言,互通时,需各位注意此问题

附赠一个,格式转化的函数,没经过测试哈...

php实现数组中索引关联数据转换成json对象的方法(请关注核心,该方法的框架环境自行忽略)

public static function encode(&$var)

{

return '{'.implode(',',self::encodeExcute($var)).'}';

}

private static function encodeExcute(&$var)

{

$json = array();

switch (gettype($var))

{

case 'array':

foreach($var as $key=>$value)

{

if(is_array($value))

{

$json[] = '"'.$key.'":{'.implode(',',self::encodeExcute($value)).'}';

//$json[$key] = self::encode($value);

} elseif (is_object($value)) {

$json[] = "\\"{$key}\\":".json_encode($value->attributes);

} else {

echo 'ERROR 未知类型,还未解析';

Yii::app()->end();

}

}

break;

case 'object':

break;

}

return $json;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值