我有一个大约有50个按键的阵列。值。我想从数组中获取数组并创建类属性:
$arr = array();
$arr['name'] = 'John';
$arr['age'] = '20';
$object = (object) $arr;
echo $object->name;
我的问题是,这是非常耗费资源的吗?是否需要大量阵列的开销?如果是这样,会有更好的方法吗?
此外,如果阵列设置为:
,则不起作用$arr = array();
$arr['name']['boy'] = 'John';
$arr['name']['girl'] = 'Jane';
$arr['age']['boy'] = '20';
$arr['age']['girl'] = '30';
$object = (object) $arr;
echo $object->name->boy;
答案 0 :(得分:0)
你可以这样做:
$arr = array();
$arr['name']['boy'] = 'John';
$arr['name']['girl'] = 'Jane';
$arr['age']['boy'] = '20';
$arr['age']['girl'] = '30';
$obj = json_decode(json_encode($arr)); //Turn it into an object
print_r($obj); // to view the result
echo $obj->name->boy; // output: John
它适用于简单数组和子数组。
我认为当我们使用子阵列并希望节省资源时,这是一个很好的解决方案
答案 1 :(得分:0)
根据documentation创建了一个stdClass类型的对象。我的猜测是,写时复制不起作用。使用memory_get_usage()
进行的简短实验显示了以下结果(三种不同的脚本):
$arr=range(10,10000); $obj = $arr; var_dump(memory_get_usage()); // int(1717424)
$obj=(object)range(10,10000); var_dump(memory_get_usage()); // int(1717528)
$arr=range(10,10000); $obj = (object)$arr; var_dump(memory_get_usage());// int(2728048)
所以你肯定会使用更多的内存。如果你想减少资源,这样的事情应该有效:
$object = (object)array('name' => 'John');
更好的方法是从头开始使用对象:
$arr = new ArrayObject(array(), ArrayObject::STD_PROP_LIST);
虽然嵌套数组会遇到同样的问题。如果您知道数组的结构,请尝试扩展ArrayObject
。或者,您可以编写自己的offsetSet()
方法来实现所需的行为。看看ArrayAccess。