如何在PHP中将数组转换为对象?

str*_*ade 329 php arrays casting object

我怎样才能将这样的数组转换为对象?

    [128] => Array
        (
            [status] => Figure A.
 Facebook's horizontal scrollbars showing up on a 1024x768 screen resolution.
        )

    [129] => Array
        (
            [status] => The other day at work, I had some spare time
        )

)

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

  • "因为变量不能以数字开头",是的,它们可以:$ object - > {3} ='xyz'; (40认同)
  • "具有2-3倍的性能影响"这是一种不公平的比较,因为后一种方法返回递归对象,而没有其他条件的循环方法(如@streetparade的答案)仅转换第一级. (9认同)
  • @feeela我认为这根本不公平..我确实提到它会递归转换.此外,使用平面输入数组(不会使用任何递归)达到2-3倍的性能命中率 (7认同)
  • 警告!不同环境中的json_decode以不同方式转换UTF-8数据.我最终在本地获得了'240.00'的价值,在生产中获得了'240' - 大规模的混乱.Morover如果转换失败,则字符串get返回为NULL (6认同)
  • 请注意,在使用 json_* 函数时:在这种情况下,存储在原始数组中的引用(例如对其他数组)将被复制。假设数组中的键 `x` 持有对另一个数组的引用。然后`$object->x` 在你的单行程序执行后将是`$array['x']` 的副本,不再是对原始数组的引用。这在某些应用程序中可能是无害的,但对于大型数组,它会浪费内存,并且如果稍后使用该引用可能会扰乱执行。 (2认同)

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)

不漂亮,但有效.

  • 不要忘记,使用这种方式你将失去除基本类型之外的所有类型.例如,DateTime将是转换器stdObject. (3认同)
  • 我真的很喜欢这个解决方案,使用内置函数而不是用户定义总是更快,这个很好用.谢谢你的提示. (2认同)

joh*_*nes 99

简单的方法是

$object = (object)$array;
Run Code Online (Sandbox Code Playgroud)

但那不是你想要的.如果你想要想要实现某些东西的对象,那么这个问题就缺少了.仅仅出于使用对象的原因使用对象是没有意义的.

  • 为什么他必须给出他想要使用物品的理由?我不认为这与*如何*完成有关.也许他需要json_encode他们,或序列化他们?这可能有很多原因. (18认同)
  • 没有工作,我在这里问了这个问题,所以必须有另一种方法去做 (2认同)
  • 老对话,但我有时使用对象只是因为我更喜欢 $o->thing 而不是 $a["thing"] (2认同)

Jul*_*s F 96

这有三种方式:

  1. 伪造一个真实的物体:

    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)
  2. 通过将数组转换为对象将数组转换为对象:

    $array = array(
        // ...
    );
    $object = (object) $array;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 手动将数组转换为对象:

    $object = object;
    foreach ($arr as $key => $value) {
        $object->{$key} = $value;
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 为什么有人想要使用与2)不同的方法?有什么缺点吗? (16认同)
  • 将数组类型转换为对象并不适用于嵌套数组 (7认同)
  • 嗯,谢谢你的脸类给出了以下错误致命错误:无法在第10行的/var/www/bot/inc/twitter-bot.php中重新分配$ this (2认同)
  • $ array =&(object)$ array ==很好的KISS实现! (2认同)

sta*_*bit 33

简单的方法,这将为递归数组创建一个对象:

$object = json_decode(json_encode((object) $yourArray), FALSE);
Run Code Online (Sandbox Code Playgroud)

  • 将`false`传递给`json_decode()`将返回一个关联数组. (3认同)
  • @ user3284463将true传递给json_decode将返回一个关联数组,默认值为false并返回一个StdClass实例。 (2认同)

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)


Noh*_*hab 9

您可以使用(对象)函数将数组转换为对象。

$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)“上班的那天,我有一些空闲时间”}}

  • 这里(对象)不是一个函数,你只是做了类型转换。 (2认同)

vde*_*nne 8

我肯定会像这样干净利落的方式:

<?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)

如果你提交:

formulaire

你会得到这个:

麦克风

我发现这更合乎逻辑,比较上面的答案来自对象应该用于他们已经制作的目的(封装可爱的小物件).

同样使用get_object_vars确保在被操纵的对象中不会创建额外的属性(您不希望汽车具有姓氏,也不需要表现出4个车轮的人).


sle*_*vy1 6

您还可以使用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)


min*_*jul 6

递归是你的朋友:

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)


Ank*_*rma 6

一些复杂但易于扩展的技术:

假设你有一个数组

$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)


We *_*lio 6

一个班轮

$object= json_decode(json_encode($result_array, JSON_FORCE_OBJECT));
Run Code Online (Sandbox Code Playgroud)


Tim*_*row 6

我使用的那个(它是一个类成员):

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)


Edu*_*omo 5

简单:

$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)