php中对象转数组有哪些方法(总结测试)
一、总结
一句话总结:json_decode(json_encode($array),true)和array强制转换(或带递归)
1、array方式强制转换对象为数组的方式中,属性的权限不同会有影响么?
结果是对的,但是对象的属性如果是protected的话,转换成数组的键的时候属性名前会加上*字符
array(9) {
["*questions"] => array(21) {
[0] => array(13) {
["bq_id"] => int(28)
["bq_b_id"] => int(5)
这个*是因为我的属性是protected的,如果属性换成public,就没有了
2、用(array)方式递归转化解决的问题是什么?
实质是解决对象里还有对象的问题,编码的话是非常简单的递归
//PHP stdClass Object转array
function object_array($array) {
if(is_object($array)) {
$array = (array)$array;
}
if(is_array($array)) {
foreach($array as $key=>$value) {
$array[$key] = object_array($value);
}
}
return $array;
}
3、json_encode如果不能将对象转化为json,我们可以怎样实现目标?
先把对象转换成数组,然后数组就可以json_encode转成json了
4、目的是获取对象中的属性,对象中的影响json_encode的题目数据(包含超级大段中文)其实是不需要的,带上反而导致无法使用json_encode函数给了我们什么启示?
关注所需,剔除掉干扰元素
二、php中对象转数组有哪些方法
1、用(array)方式递归转化(实质是解决对象里还有对象的问题)
//PHP stdClass Object转array
function object_array($array) {
if(is_object($array)) {
$array = (array)$array;
}
if(is_array($array)) {
foreach($array as $key=>$value) {
$array[$key] = object_array($value);
}
}
return $array;
}
结果是对的,但是对象的属性如果是protected的话,转换成数组的键的时候属性名前会加上*字符
array(9) {
["*questions"] => array(21) {
[0] => array(13) {
["bq_id"] => int(28)
["bq_b_id"] => int(5)
这个*是因为我的属性是protected的,如果属性换成public,就没有了
2、转$xmlString的
$array = json_decode(json_encode(simplexml_load_string($xmlString)),TRUE);
3、json_decode(json_encode($array),true)方式
这个你对象首先能被json_encode才行
4.如果是10W的数据量的话,执行要进1s,结构再复杂些,可以达到3s,性能太差了,可以用以下替换:
function object2array(&$object) {
$object = json_decode( json_encode( $object),true);
return $object;
}
4、$arr = (array)$obj方式转化的效果
如果对象里面没有对象,这个方法是对的
对象里面还有对象,就得用第一种递归的方式将所有的对象都转换成数组
参考:PHP中把对象转数组的几个方法 - ThinkPHP框架
http://www.thinkphp.cn/code/2903.html