Converting to object an indexed array

Possible Duplicate:
Casting an Array with Numeric Keys as an Object

I was wondering about (object) type casting.

It's possible to do a lot of useful things, like converting an associative array to an object, and some not so useful and a bit funny (IMHO) things, like converting a scalar value to object.

But how can I access the result of casting of an indexed array?

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

How about accessing a specific value?

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
                     )
                    */

The following works because stdClass implements dynamically Countable and ArrayAccess :

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

This is actually a reported bug.

It has been deemed as "too expensive to fix" and the resolution has been "updated the documentation to describe this useless quirk, so it is now officially correct behavior" [1].

However, there are some workarounds .

As get_object_vars gives you nothing, only thing you can do is:

  • You can iterate on the stdClass using foreach
  • You can cast it back as array.
  • You can change cast it to object using json_decode+json_encode (this is dirty trick)
  • Example 1.:

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

    Example 2.:

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

    Example 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"}
    

    This is why you shouldn't cast non-associative array as object :)

    But if you want to, do it in this way:

    // 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')));
    

    instead of

    $obj = (Object) array('apple','fruit'); 
    
    链接地址: http://www.djcxy.com/p/11130.html

    上一篇: 自我“HABTM”或“HasMany Through”概念混淆

    下一篇: 转换为对象索引数组