7

可能重复:
将带有数字键的数组转换为对象

我想知道(object)类型转换。

可以做很多有用的事情,例如将关联数组转换为对象,以及一些不太有用且有点有趣(恕我直言)的事情,例如将标量值转换为 object

但是如何访问索引数组的转换结果?

// Converting to object an indexed array
$obj = (object) array( 'apple', 'fruit' );

如何访问特定值?

print $obj[0];      // Fatal error & doesn't have and any sense
print $obj->scalar[0];  // Any sense
print $obj->0;      // Syntax error
print $obj->${'0'};     // Fatal error: empty property.   
print_r( get_object_vars( $obj ) ); // Returns Array()

print_r( $obj );    /* Returns
                    stdClass Object
                     (
                            [0] => apple
                            [1] => fruit
                     )
                    */

以下工作,因为stdClass动态实现CountableArrayAccess

foreach( $obj as $k => $v ) {
    print $k . ' => ' . $v . PHP_EOL;
}  
4

1 回答 1

3

这实际上是一个报告的错误

它被认为“修复成本太高”,解决方案已“更新了文档以描述这种无用的怪癖,因此现在正式正确的行为” [1]

但是,有一些解决方法

因为get_object_vars什么都没有给你,你唯一能做的就是:

  1. 您可以迭代stdClass使用foreach
  2. 您可以将其转换为数组。
  3. 您可以使用 json_decode+json_encode 将其转换为对象(这是肮脏的把戏)

示例 1:

$obj = (object) array( 'apple', 'fruit' );
foreach($obj as $key => $value) { ...

示例 2:

$obj = (object) array( 'apple', 'fruit' );
$array = (array) $obj;
echo $array[0];

示例 3:

$obj = (object) array( 'apple', 'fruit' );    
$obj = json_decode(json_encode($obj));    
echo $obj->{'0'};
var_dump(get_object_vars($obj)); // array(2) {[0]=>string(5) "apple"[1]=>string(5)"fruit"}

这就是为什么您不应该将非关联数组转换为对象的原因:)

但是,如果您愿意,请按以下方式进行:

// PHP 5.3.0 and higher
$obj = json_decode(json_encode(array('apple', 'fruit'), JSON_FORCE_OBJECT));
// PHP 5 >= 5.2.0
$obj = json_decode(json_encode((Object) array('apple', 'fruit')));

代替

$obj = (Object) array('apple','fruit'); 
于 2012-09-01T14:31:33.990 回答