jlb*_*jlb 529
在最简单的情况下,将数组"转换"为对象可能就足够了:
$object = (object) $array;
Run Code Online (Sandbox Code Playgroud)
另一种选择是将标准类实例化为变量,并在重新分配值时循环遍历数组:
$object = new stdClass();
foreach ($array as $key => $value)
{
$object->$key = $value;
}
Run Code Online (Sandbox Code Playgroud)
正如Edson Medina所指出的,一个非常干净的解决方案是使用内置json_
函数:
$object = json_decode(json_encode($array), FALSE);
Run Code Online (Sandbox Code Playgroud)
这也(递归地)将所有子数组转换为对象,您可能想要也可能不想要.不幸的是,它比循环方法的性能提高了2-3倍.
警告!(感谢Ultra的评论):
不同环境中的json_decode以不同方式转换UTF-8数据.我最终在本地获得了'240.00'的价值,在生产中获得了'240' - 大规模的混乱.Morover如果转换失败,则字符串get返回为NULL
Sha*_*baz 150
你可以简单地使用类型转换将数组转换为对象.
// *convert array to object* Array([id]=> 321313[username]=>shahbaz)
$object = (object) $array_name;
//now it is converted to object and you can access it.
echo $object->username;
Run Code Online (Sandbox Code Playgroud)
Eds*_*ina 102
快速破解:
// assuming $var is a multidimensional array
$obj = json_decode (json_encode ($var), FALSE);
Run Code Online (Sandbox Code Playgroud)
不漂亮,但有效.
joh*_*nes 99
简单的方法是
$object = (object)$array;
Run Code Online (Sandbox Code Playgroud)
但那不是你想要的.如果你想要想要实现某些东西的对象,那么这个问题就缺少了.仅仅出于使用对象的原因使用对象是没有意义的.
Jul*_*s F 96
这有三种方式:
伪造一个真实的物体:
class convert
{
public $varible;
public function __construct($array)
{
$this = $array;
}
public static function toObject($array)
{
$array = new convert($array);
return $array;
}
}
Run Code Online (Sandbox Code Playgroud)通过将数组转换为对象将数组转换为对象:
$array = array(
// ...
);
$object = (object) $array;
Run Code Online (Sandbox Code Playgroud)手动将数组转换为对象:
$object = object;
foreach ($arr as $key => $value) {
$object->{$key} = $value;
}
Run Code Online (Sandbox Code Playgroud)sta*_*bit 33
简单的方法,这将为递归数组创建一个对象:
$object = json_decode(json_encode((object) $yourArray), FALSE);
Run Code Online (Sandbox Code Playgroud)
hak*_*kre 23
根据您的需要以及如何访问对象,有不同的方法.
例如:只是对它进行类型转换
$object = (object) $yourArray;
Run Code Online (Sandbox Code Playgroud)
但是,最兼容的方法是使用实用程序方法(还不是PHP的一部分),它基于指定类型的字符串实现标准PHP转换(或者忽略它只是取消引用该值):
/**
* dereference a value and optionally setting its type
*
* @param mixed $mixed
* @param null $type (optional)
*
* @return mixed $mixed set as $type
*/
function rettype($mixed, $type = NULL) {
$type === NULL || settype($mixed, $type);
return $mixed;
}
Run Code Online (Sandbox Code Playgroud)
您的案例中的用法示例(在线演示):
$yourArray = Array('status' => 'Figure A. ...');
echo rettype($yourArray, 'object')->status; // prints "Figure A. ..."
Run Code Online (Sandbox Code Playgroud)
zom*_*bat 15
据我所知,没有内置方法可以做到这一点,但它就像一个简单的循环一样简单:
$obj= new stdClass();
foreach ($array as $k=> $v) {
$obj->{$k} = $v;
}
Run Code Online (Sandbox Code Playgroud)
如果你需要它来递归地构建你的对象,你可以阐述它.
str*_*ade 15
这个对我有用
function array_to_obj($array, &$obj)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
$obj->$key = new stdClass();
array_to_obj($value, $obj->$key);
}
else
{
$obj->$key = $value;
}
}
return $obj;
}
function arrayToObject($array)
{
$object= new stdClass();
return array_to_obj($array,$object);
}
Run Code Online (Sandbox Code Playgroud)
用法:
$myobject = arrayToObject($array);
print_r($myobject);
Run Code Online (Sandbox Code Playgroud)
回报:
[127] => stdClass Object
(
[status] => Have you ever created a really great looking website design
)
[128] => stdClass Object
(
[status] => Figure A.
Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
)
[129] => stdClass Object
(
[status] => The other day at work, I had some spare time
)
Run Code Online (Sandbox Code Playgroud)
像往常一样,你可以循环它:
foreach($myobject as $obj)
{
echo $obj->status;
}
Run Code Online (Sandbox Code Playgroud)
小智 13
我也有这个问题,但我注意到 json_decode 将 JSON 数组转换为对象。
所以,我通过使用 json_encode($PHPArray) 来解决我的解决方案,它返回一个 JSON 对象字符串,然后我用 Json_decode($string) 解码字符串,它会返回一个完美结构化的对象。 速记
$object = json_decode(json_encode($array));
Run Code Online (Sandbox Code Playgroud)
或者
$jsonString = json_encode($array);
$object = json_decode($jsonString);
Run Code Online (Sandbox Code Playgroud)
小智 9
实际上,如果你想在多维数组中使用它,你会想要使用一些递归.
static public function array_to_object(array $array)
{
foreach($array as $key => $value)
{
if(is_array($value))
{
$array[$key] = self::array_to_object($value);
}
}
return (object)$array;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用(对象)函数将数组转换为对象。
$arr= [128=> ['status'=>
'Figure A. Facebook \'s horizontal scrollbars showing up on a 1024x768 screen resolution.'],
129=>['status'=>'The other day at work, I had some spare time']];
$ArrToObject=(object)$arr;
var_dump($ArrToObject);
Run Code Online (Sandbox Code Playgroud)
结果将是一个包含数组的对象:
object(stdClass)#1048(2){[128] => array(1){
[“ status”] =>字符串(87)“图A. Facebook的水平滚动条以1024x768的屏幕分辨率显示。}
[129] => array(1){[“状态”] => string(44)“上班的那天,我有一些空闲时间”}}
我肯定会像这样干净利落的方式:
<?php
class Person {
private $name;
private $age;
private $sexe;
function __construct ($payload)
{
if (is_array($payload))
$this->from_array($payload);
}
public function from_array($array)
{
foreach(get_object_vars($this) as $attrName => $attrValue)
$this->{$attrName} = $array[$attrName];
}
public function say_hi ()
{
print "hi my name is {$this->name}";
}
}
print_r($_POST);
$mike = new Person($_POST);
$mike->say_hi();
?>
Run Code Online (Sandbox Code Playgroud)
如果你提交:
你会得到这个:
我发现这更合乎逻辑,比较上面的答案来自对象应该用于他们已经制作的目的(封装可爱的小物件).
同样使用get_object_vars确保在被操纵的对象中不会创建额外的属性(您不希望汽车具有姓氏,也不需要表现出4个车轮的人).
您还可以使用ArrayObject,例如:
<?php
$arr = array("test",
array("one"=>1,"two"=>2,"three"=>3),
array("one"=>1,"two"=>2,"three"=>3)
);
$o = new ArrayObject($arr);
echo $o->offsetGet(2)["two"],"\n";
foreach ($o as $key=>$val){
if (is_array($val)) {
foreach($val as $k => $v) {
echo $k . ' => ' . $v,"\n";
}
}
else
{
echo $val,"\n";
}
}
?>
//Output:
2
test
one => 1
two => 2
three => 3
one => 1
two => 2
three => 3
Run Code Online (Sandbox Code Playgroud)
递归是你的朋友:
function __toObject(Array $arr) {
$obj = new stdClass();
foreach($arr as $key=>$val) {
if (is_array($val)) {
$val = __toObject($val);
}
$obj->$key = $val;
}
return $obj;
}
Run Code Online (Sandbox Code Playgroud)
一些复杂但易于扩展的技术:
假设你有一个数组
$a = [
'name' => 'ankit',
'age' => '33',
'dob' => '1984-04-12'
];
Run Code Online (Sandbox Code Playgroud)
假设您有一个Person类,该类可能具有来自此数组的更多或更少的属性.例如
class Person
{
private $name;
private $dob;
private $age;
private $company;
private $city;
}
Run Code Online (Sandbox Code Playgroud)
如果您仍想将数组更改为person对象.您可以使用ArrayIterator类.
$arrayIterator = new \ArrayIterator($a); // Pass your array in the argument.
Run Code Online (Sandbox Code Playgroud)
现在你有了迭代器对象.
创建一个扩展FilterIterator类的类; 你必须在哪里定义抽象方法accept.根据例子
class PersonIterator extends \FilterIterator
{
public function accept()
{
return property_exists('Person', parent::current());
}
}
Run Code Online (Sandbox Code Playgroud)
仅当属性存在于类中时,上述impelmentation才会绑定该属性.
在PersonIterator类中添加一个方法
public function getObject(Person $object)
{
foreach ($this as $key => $value)
{
$object->{'set' . underscoreToCamelCase($key)}($value);
}
return $object;
}
Run Code Online (Sandbox Code Playgroud)
确保你的班级定义了mutators.现在,您可以在要创建对象的位置调用这些函数.
$arrayiterator = new \ArrayIterator($a);
$personIterator = new \PersonIterator($arrayiterator);
$personIterator->getObject(); // this will return your Person Object.
Run Code Online (Sandbox Code Playgroud)
一个班轮
$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
Run Code Online (Sandbox Code Playgroud)
我使用的那个(它是一个类成员):
const MAX_LEVEL = 5; // change it as needed
public function arrayToObject($a, $level=0)
{
if(!is_array($a)) {
throw new InvalidArgumentException(sprintf('Type %s cannot be cast, array expected', gettype($a)));
}
if($level > self::MAX_LEVEL) {
throw new OverflowException(sprintf('%s stack overflow: %d exceeds max recursion level', __METHOD__, $level));
}
$o = new stdClass();
foreach($a as $key => $value) {
if(is_array($value)) { // convert value recursively
$value = $this->arrayToObject($value, $level+1);
}
$o->{$key} = $value;
}
return $o;
}
Run Code Online (Sandbox Code Playgroud)
简单:
$object = json_decode(json_encode($array));
Run Code Online (Sandbox Code Playgroud)
例子:
$array = array(
'key' => array(
'k' => 'value',
),
'group' => array('a', 'b', 'c')
);
$object = json_decode(json_encode($array));
Run Code Online (Sandbox Code Playgroud)
那么,以下情况为真:
$object->key->k === 'value';
$object->group === array('a', 'b', 'c')
Run Code Online (Sandbox Code Playgroud)
小智 5
使用我做的这个功能:
function buildObject($class,$data){
$object = new $class;
foreach($data as $key=>$value){
if(property_exists($class,$key)){
$object->{'set'.ucfirst($key)}($value);
}
}
return $object;
}
Run Code Online (Sandbox Code Playgroud)
用法:
$myObject = buildObject('MyClassName',$myArray);
Run Code Online (Sandbox Code Playgroud)
小智 5
这需要PHP7,因为我选择使用lambda函数来锁定主函数中的“ innerfunc”。lambda函数是递归调用的,因此需要:“ use(&$ innerfunc)”。您可以在PHP5中完成此操作,但无法隐藏innerfunc。
function convertArray2Object($defs) {
$innerfunc = function ($a) use ( &$innerfunc ) {
return (is_array($a)) ? (object) array_map($innerfunc, $a) : $a;
};
return (object) array_map($innerfunc, $defs);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
626826 次 |
最近记录: |