转换为对象索引数组

可能重复:
使用数字键作为对象来投射数组

我想知道(object)类型的铸造。

有可能做很多有用的事情,比如将一个关联数组转换为一个对象,还有一些不太有用和有趣的事情(IMHO),比如将标量值转换为对象。

但是,我怎样才能访问转换索引数组的结果呢?

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

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

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

但是,有一些解决方法

由于get_object_vars给你任何东西,所以你只能做的事情是:

  • 你可以使用foreach迭代stdClass
  • 您可以将其转换为数组。
  • 你可以改变使用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'); 
    
    链接地址: http://www.djcxy.com/p/11129.html

    上一篇: Converting to object an indexed array

    下一篇: Remote Server File Upload Via PHP