有人知道如何在一行中从这个数组中打印数字200吗?

时间:2016-09-22 18:32:09

标签: php arrays

我试图从这个数组中打印出数字200,但我不知道如何使用(对象)强制转换。

$x= [(object)["items"=>[1=>100,2=>200]]];

1 个答案:

答案 0 :(得分:-2)

不应该盲目地将数组转换为对象,因为它不安全。 PHP在手册中明确警告不要这样做。

  

数组转换为具有按键和相应值命名的属性的对象,但除非迭代,否则将无法访问数字键。

     

PHP Manual: Type Juggling

这意味着投射到对象的数组中的任何数字键都将变得不可访问。在这种特殊情况下,正在转换的数组中唯一的键恰好是一个字符串,这意味着$x->items[2]将给出预期的结果。

因此,例如,$x = (object) [1=>100,2=>200]将导致$x[2]$x["2"]始终为空,尽管var_dump($x)显示为否则。这对于不经意的观察者来说可能是非常特殊的。

因此,如果您想要安全地将数组转换为对象,则可以使用此方法。

function recursiveArrayToObject(Array $arr, stdClass $obj = null) {
    if (!$obj) {
        $obj = new stdClass;
    }
    foreach($arr as $key => $value) {
        if (is_array($value)) {
            $obj->$key = recursiveArrayToObject($value);
        } else {
            $obj->$key = $value;
        }
    }
    return $obj;
}

$x = ["items"=>[1=>100,2=>200]];
$xObj = recursiveArrayToObject($x);
var_dump($xObj);

这会给你......

object(stdClass)#1 (1) {
  ["items"]=>
  object(stdClass)#2 (2) {
    ["1"]=>
    int(100)
    ["2"]=>
    int(200)
  }
}

所以现在$xObj->items->{"2"}会按预期给你200

如果你想要安全,非递归的版本......

function arrayToObject(Array $arr, stdClass $obj = null) {
    if (!$obj) {
        $obj = new stdClass;
    }
    foreach($arr as $key => $value) {
        $obj->$key = $value;
    }
    return $obj;
}

$x = ["items"=>[1=>100,2=>200]];
$xObj = arrayToObject($x);
var_dump($xObj, $xObj->items[2]);

...输出

object(stdClass)#1 (1) {
  ["items"]=>
  array(2) {
    [1]=>
    int(100)
    [2]=>
    int(200)
  }
}
int(200)