PHP中把stdClass Object转array的几个方法

本文介绍在PHP中如何将StdClass类型的对象转换为数组。提供了三种转换方法,并对比了它们之间的性能差异,最后给出了一种高效转换方案。

PHP和JS通讯通常都用json,但用 json 传过来的数组并不是标准的array,而是 stdClass 类型。那么我们可以参考下面的几个方法进行转换。

方法一:

//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;  
}

方法二:

$array = json_decode(json_encode(simplexml_load_string($xmlString)),TRUE);

方法三:

 function object2array_pre(&$object) {
        if (is_object($object)) {
            $arr = (array)($object);
        } else {
            $arr = &$object;
        }
        if (is_array($arr)) {
            foreach($arr as $varName => $varValue){
                $arr[$varName] = $this->object2array($varValue);
            }
        }
        return $arr;
    }```


如果是10W的数据量的话,执行要进1s,结构再复杂些,可以达到3s, 性能太差了
可以用以下替换:

function object2array(&$object) {

         $object =  json_decode( json_encode( $object),true);
         return  $object;

}


 但是对json的特性,只能是针对utf8的,否则得先转码下。

<think>好的,我现在需要处理用户关于PHP中对象和数组相互换的问题。首先,我得回顾一下用户提供的引用内容,确保回答准确。用户提到了引用1和引用2,其中引用1主要讲的是stdClass,说明它是一个基类,用于创建没有方法的对象,而引用2则提到PHP的数组和对象换的方法。 首先,我需要明确PHP中对象和数组换的常用方法。常见的做法是使用类型换,或者使用内置函数如get_object_vars。但用户可能想知道更具体的步骤,比如如何将数组换为对象,或者反过来。 根据引用1,stdClass是一个空类,可以用来创建匿名对象。所以当数组换为对象时,可能会使用到stdClass。而数组到对象的换,可以通过强制类型(array)或者(json_encode/json_decode),不过可能更常见的是使用类型换或者遍历数组手动赋值给对象的属性。 另一个方法是使用get_object_vars函数,它可以将对象的属性提取为数组。反过来,如果要将数组换为对象,可能需要循环数组并将每个元素作为对象的属性,或者使用json_decode(json_encode($array), false),这样可以将数组换为stdClass对象。 需要注意的是,当数组的键是数字时,换成对象后属性名可能不符合PHP的变量命名规则,所以这种情况下可能会有问题。此外,关联数组换更为直接,而索引数组可能需要特殊处理。 用户还可能关心如何深层次换,比如多维数组和嵌套对象之间的换。这时候可能需要递归处理。 在引用中提到的stdClass的作用,应该强调它在换中的用途,比如当使用(array)换数组到对象时,会自动成为stdClass的实例。而使用对象换到数组时,会得到对象的公有属性。 另外,需要检查是否有其他方法,比如使用ArrayObject类,它允许数组以对象形式被操作,这可能也是用户感兴趣的部分。不过用户的问题更侧重于换,而不是操作方式。 现在需要组织这些信息,分步骤说明方法,并给出示例代码。同时,确保回答结构清晰,符合用户要求的系统级指令,比如使用中文,数学公式正确,生成相关问题等。 需要验证示例代码的正确性,比如: 对于数组对象,使用类型换: $obj = (object)$array; 对于对象数组,使用类型换: $array = (array)$obj; 或者使用get_object_vars: $array = get_object_vars($obj); 同时,处理可能存在的私有属性问题,因为(array)换会包括所有属性,而get_object_vars只获取公有属性。 还要提到json方法,比如: $obj = json_decode(json_encode($array)); 这可能适用于更复杂的结构,但需要注意性能问题。 最后,生成相关问题,比如换时的注意事项,多维数组如何处理,或者性能比较等。 需要确保回答中引用了用户提供的引用内容,比如提到stdClass的作用时引用[^1],提到PHP语法时引用[^2]。 可能还需要注意用户提到的PHP版本,比如引用1中提到PHP5开始流行stdClass,所以可能在不同版本中方法是否适用。 总之,整理出步骤,给出示例代码,并引用相关内容,最后生成相关问题。</think>### PHP中对象和数组相互换的方法PHP中,对象和数组的相互换是常见的操作,尤其在处理数据时。以下是几种常用方法及其示例: --- #### 1. **数组换为对象** **方法一:强制类型换** 使用`(object)`将数组直接换为`stdClass`对象。 ```php $array = ['name' => 'John', 'age' => 25]; $obj = (object)$array; echo $obj->name; // 输出: John ``` *说明*:换后,数组的键成为对象的属性,值为对应的属性值。此方法适用于关联数组,索引数组的键会换为数字属性名(如`$obj->{'0'}`)[^1]。 **方法二:通过`json_encode`和`json_decode`** 适用于多维数组或需要深层次换的场景。 ```php $array = ['user' => ['name' => 'Alice', 'age' => 30]]; $obj = json_decode(json_encode($array)); echo $obj->user->name; // 输出: Alice ``` *注意*:`json_decode`默认返回`stdClass`对象,若需返回数组,需设置第二个参数为`true`[^2]。 --- #### 2. **对象换为数组** **方法一:强制类型换** 使用`(array)`将对象换为数组。 ```php class User { public $name = 'Bob'; private $id = 100; } $user = new User(); $array = (array)$user; print_r($array); // 输出: ['name' => 'Bob', "\0User\0id" => 100] ``` *说明*:私有或受保护属性会被换为包含类名的键(如`\0User\0id`),可能需进一步处理。 **方法二:使用`get_object_vars`函数** 仅获取对象的公有属性。 ```php $array = get_object_vars($user); print_r($array); // 输出: ['name' => 'Bob'] ``` *注意*:此方法无法获取私有或受保护属性[^1]。 **方法三:递归换(适用于嵌套对象)** 自定义函数处理多层结构: ```php function objectToArray($obj) { if (is_object($obj)) { $obj = (array)$obj; } if (is_array($obj)) { return array_map(__FUNCTION__, $obj); } return $obj; } $result = objectToArray($user); ``` --- #### 3. **注意事项** - **`stdClass`的作用**:PHP中的`stdClass`是一个空基类,常用于动态创建对象。例如`$obj = new stdClass(); $obj->key = 'value';`[^1]。 - **性能问题**:直接类型换效率较高,而`json`方法可能因编解码开销影响性能。 - **属性可见性**:强制类型换会包含所有属性,但需注意键名格式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值