php 显示对像编码,PHP对象编码 - 胡伟松的个人空间 - OSCHINA - 中文开源技术交流社区...

在php开发过程中,我们经常使用到json_encode和json_decode,但是在对于数字key的编码存在一些蹊跷。尽量避免使用数字作为数组的键。

$arr1=['0'=>1,'1'=>2,'2'=>3,];#相当于[1,2,3,]

$obj1=(object)$arr1;#object(stdClass)

$str_arr1=json_encode($arr1);#0-n连续数字键的数组将会被编码成只有值得形式

$str_obj1=json_encode($obj1);#强制将数组转成object之后编码会按照key-value形式

echo $str_arr1."\n";#[1,2,3]

echo $str_obj1."\n";#{"0":1,"1":2,"2":3}

echo "-----------\n";

$arr2=['0'=>1,'2'=>2,'3'=>3];

$obj2=(object)$arr2;

$str_arr2=json_encode($arr2);#不连续或者非0开始的数字键的数组编码会按照key-value形式

$str_obj2=json_encode($obj2);#强制objec

echo $str_arr2."\n";#{"0":1,"2":2,"3":3}

echo $str_obj2."\n";#{"0":1,"2":2,"3":3}

echo "----------\n";

$arr3=['a'=>1,'b'=>2,'c'=>3];

$obj3=(object)$arr3;

$str_arr3=json_encode($arr3);#存在非数字键数组编码会按照key-value形式

$str_obj3=json_encode($obj3);#强制objec

echo $str_arr3."\n";#{"a":1,"b":2,"c":3}

echo $str_obj3."\n";#{"a":1,"b":2,"c":3}

echo "----------\n";

在对数组进行编码的时候,如果是0-n的连续数字键,并且需要输出key-value的形式,那么在编码之前前置转成object

$str1='[1,2]';

$obj1=json_decode($str1);#array(2)

$arr1=json_decode($str1,true);#array(2)

var_dump($arr1);

var_dump($obj1);

echo "---------\n";

$str2='{"0":1,"1":2}';

$str3='{"0":1,"2":2}';#和str2效果一模一样

$str4='{"a":1,"b":2}';#和str2效果一模一样

$obj2=json_decode($str2);#object(stdClass)

$arr2=json_decode($str2,true);#array(2)

var_dump($arr2);

var_dump($obj2);

echo "---------\n";

对于json_decode我们习惯性的在第二个参数上加上true,根据文档的官方解释,When TRUE, returned objects will be converted into associative arrays.那么我们加上true的好处是什么?

$str1='[1,2]';

$obj1=json_decode($str1);#array(2)

$arr1=json_decode($str1,true);#array(2)

echo "arr1和obj1都是数组,你可以通过这样的形式获取键值arr1[0],obj1[1]:{$arr1[0]},{$obj1[1]}\n";

echo "---------\n";

$str2='{"0":1,"1":2}';

$obj2=json_decode($str2);#object(stdClass)

$arr2=json_decode($str2,true);#array(2)

echo "obj2是对象,但是你不能通过这样的形式获取键值obj2->{'0'},obj2->{'1'}!!!!!!!!!!!\n";

echo "arr2是数组,你可以通过这样的形式获取键值arr2[0],arr2[1]:{$arr2[0]},{$arr2[1]}\n";

echo "---------\n";

$str4='{"a":1,"b":2}';

$obj4=json_decode($str4);#object(stdClass)

$arr4=json_decode($str4,true);#array(2)

echo "obj4是对象,你可以通过这样的形式获取键值obj4->a,obj2->b:{$obj4->a},{$obj4->b}\n";

echo "arr4是数组,你可以通过这样的形式获取键值arr4['a'],arr4['b']:{$arr4['a']},{$arr4['b']}\n";

echo "---------\n";

echo "如果你想要获得对象的数字键值,你必须通过遍历的形式来获取:\n";

foreach($obj2as$key=>$value){

echo "key:{$key},values:{$value}\n";

}

习惯性的在第二个参数上加上true的目的是为了在程序中方便使用数组的形式来获取键值。

中文翻译“除了数字键,不迭代就无法被访问”理解比较费劲,正确意思是“数字键比较特殊,不迭代无法访问数字键”。参考下面英文版本文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值