在PHP中初始化像数组一样的对象?

Pek*_*ica 28 php

在PHP中,您可以使用以下表示法快速初始化具有值的数组:

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....
Run Code Online (Sandbox Code Playgroud)

有没有办法为STDClass对象做这个?我不知道比沉闷更短的路

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
Run Code Online (Sandbox Code Playgroud)

Gum*_*mbo 41

你可以使用类型转换:

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );
Run Code Online (Sandbox Code Playgroud)

  • Jani,你有一点意见,但我只是*喜欢*解决容器 - >方式.:) (3认同)

nic*_*kl- 25

我也将Gumbo投票作为首选解决方案,但他所建议的并不是所要求的,这可能会导致一些混淆,为什么member1o看起来更像是一个member1a.

为了确保现在这一点很清楚,stdClass在php中生成相同的两种方式(现在是5.4以来的3种方式).

  1. 根据问题的长期或手动方法:

    $object = new stdClass;
    $object->member1 = "hello, I'm 1";
    $object->member1o = new stdClass;
    $object->member1o->member1 = "hello, I'm 1o.1";
    $object->member2 = "hello, I'm 2";
    
    Run Code Online (Sandbox Code Playgroud)
  2. ala Gumbo的建议是从阵列中投射一个物体的较短或单行版本(为了清晰起见而扩展).

    $object = (object)array(
         'member1' => "hello, I'm 1",
         'member1o' => (object)array(
             'member1' => "hello, I'm 1o.1",
         ),
         'member2' => "hello, I'm 2",
    );
    
    Run Code Online (Sandbox Code Playgroud)
  3. PHP 5.4+缩短的数组声明样式

    $object = (object)[
         'member1' => "hello, I'm 1",
         'member1o' => (object)['member1' => "hello, I'm 1o.1"],
         'member2' => "hello, I'm 2",
    ];
    
    Run Code Online (Sandbox Code Playgroud)

两者都会产生完全相同的结果:

stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)
Run Code Online (Sandbox Code Playgroud)

的nJoy!


Tim*_*tle 8

从显示类型转换和使用递归函数将单维和多维数组转换为标准对象的帖子:

<?php
function arrayToObject($array) {
    if (!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) && count($array) > 0) {
        foreach ($array as $name=>$value) {
            $name = strtolower(trim($name));
            if (!empty($name)) {
                $object->$name = arrayToObject($value);
            }
        }
        return $object;
    }
    else {
        return FALSE;
    }
}
Run Code Online (Sandbox Code Playgroud)

本质上,您构造一个函数,接受$array并迭代其所有键和值.它使用键将值分配给类属性.

如果值是数组,则再次(递归地)调用该函数,并将其输出指定为值.

上面的示例函数正是如此; 然而,逻辑可能与你自然想到的过程有点不同.


Spa*_*kup 6

您可以使用 :

$object = (object)[]; // shorter version of (object)array();

$object->foo = 'bar';
Run Code Online (Sandbox Code Playgroud)


out*_*tis 5

你可以尝试:

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`__FUNCTION__`可以获得更大的灵活性. (2认同)

gnu*_*nud 5

我使用一个我命名为 Dict 的类:

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它还具有与其他对象和数组合并的功能,但这有点超出了这个问题的范围。