【问题标题】:Converting to object an indexed array [duplicate]将索引数组转换为对象[重复]
【发布时间】:2012-09-01 14:16:52
【问题描述】:

可能重复:
Casting an Array with Numeric Keys as an Object

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

可以做很多有用的事情,比如将关联数组转换为对象,还有一些不太有用且有点搞笑(恕我直言)的事情,比如converting a scalar value to 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;
}  

【问题讨论】:

    标签: php casting


    【解决方案1】:

    这实际上是一个reported bug

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

    但是,有一些解决方法

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

    1. 您可以使用foreachstdClass 进行迭代
    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'); 
    

    【讨论】:

    • 感谢您的回答。我知道这很脏,我永远不会投射索引数组......但我很好奇:-) 我一直在寻找一种 clean 方法来做到这一点,而不仅仅是一种解决方法。在Mattew 注意到我重复的问题后,我阅读了接受的答案并建议您进行编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2021-11-04
    • 2019-07-14
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多