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

Initialize Objects like arrays in PHP?

提问人:Pekka 提问时间:11/16/2009 最后编辑:CharlesPekka 更新时间:11/25/2021 访问量:54787

问:

在 PHP 中,您可以使用以下符号快速初始化带有值的数组:

$array = array("name" => "member 1", array("name" => "member 1.1") ) ....

有什么方法可以对 STDClass 对象执行此操作吗? 我不知道还有什么比沉闷更短的路了

$object = new STDClass();
$object->member1 = "hello, I'm 1";
$object->member1->member1 = "hello, I'm 1.1";
$object->member2 = "hello, I'm 2";
PHP的

评论

0赞 e382df99a7950919789725ceeec126 8/25/2012
你应该把蒂姆的“正确勾号”改成小飞象的答案
2赞 Pacerier 7/27/2013
@mrzmyr,小飞象还是秋葵浓汤?
0赞 e382df99a7950919789725ceeec126 7/28/2013
@Pacerier对不起,我的意思是秋葵浓汤:)
0赞 That Realty Programmer Guy 7/21/2023
我倾向于创建一个静态方法,它可以实例化和返回新实例或它们的数组。::fromArray(...)

答:

55赞 Gumbo 11/16/2009 #1

您可以使用类型转换:

$object = (object) array("name" => "member 1", array("name" => "member 1.1") );

评论

1赞 Jani Hartikainen 11/16/2009
虽然我个人建议实际让你的类做一些事情,并使用数组作为“哑容器”,但这是做到这一点的方法。
3赞 Pekka 11/16/2009
Jani,你说得有道理,但我就是喜欢用>的方式处理容器。:)
0赞 Pekka 11/16/2009
干杯,我不知道这有那么容易——至少对于一维的。
0赞 Pacerier 7/27/2013
@Gumbo,这在 1D 以上不起作用。最简单的解决方案是编写我们自己的函数来扩展它。
0赞 ToolmakerSteve 2/16/2020
这可能也应该在第二个.请看@nickl-的回答。(object)array
9赞 Tim Lytle 11/16/2009 #2

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

<?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;
    }
}

从本质上讲,您构造了一个函数,该函数接受并遍历其所有键和值。它使用键将值分配给类属性。$array

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

上面的示例函数正是这样做的;但是,逻辑的顺序可能与您对该过程的自然思考略有不同。

评论

0赞 Pekka 11/16/2009
我要求多维数组,就是这样。谢谢。
0赞 Pekka 11/16/2009
目前,我将只使用类型转换。从长远来看,我将混合使用 gnud 和这个答案:一个可以递归工作的dumb_container对象。谢谢大家。
0赞 Taha Paksu 4/7/2017
你能把这个答案扩展到这里吗?链接可能已经死了。
0赞 AaA 1/3/2020
链接实际上已经死了!
5赞 outis 11/16/2009 #3

您可以尝试:

function initStdClass($thing) {
    if (is_array($thing)) {
      return (object) array_map(__FUNCTION__, $thing);
    }
    return $thing;
}

评论

2赞 Gumbo 11/16/2009
使用以获得更大的灵活性。__FUNCTION__
5赞 gnud 11/16/2009 #4

我使用一个名为 Dict 的类:

class Dict {

    public function __construct($values = array()) {
        foreach($values as $k => $v) {
            $this->{$k} = $v;
        }
    }
}

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

31赞 nickl- 1/13/2013 #5

我还投票将 Gumbo 作为首选解决方案,但他的建议并不完全是所问的,这可能会导致一些混淆,为什么看起来更像是 .member1omember1a

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

  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";
    
  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",
    );
    
  3. PHP 5.4+ 缩短的数组声明样式

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

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

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

    [member2] => hello, I'm 2
)

nJoy!

评论

1赞 The Thirsty Ape 6/15/2013
很好的总结。需要注意的是,member1o 需要与 memeber1 字符串不同
0赞 Con Antonakos 10/15/2015
感谢您的全面总结。希望这能被接受!
6赞 Sparkup 2/1/2015 #6

您可以使用:

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

$object->foo = 'bar';
2赞 Klesun 9/28/2016 #7

深度转换的另一个选项是使用 +(默认情况下,它解码为 stdClass)。这样,您就不必在每个嵌套对象中重复强制转换。json_encodejson_decode(object)

$object = json_decode(json_encode(array(
     'member1' => "hello, I'm 1",
     'member1o' => array(
         'member1' => "hello, I'm 1o.1",
     ),
     'member2' => "hello, I'm 2",
)));

输出:

php > print_r($object);
stdClass Object
(
    [member1] => hello, I'm 1
    [member1o] => stdClass Object
        (
            [member1] => hello, I'm 1o.1
        )

    [member2] => hello, I'm 2
)

评论

0赞 Klesun 9/28/2016
但是,空数组仍被视为数组。
4赞 Matthijs Wessels 5/8/2017 #8

这个答案到一个类似的问题:

从 PHP7 开始,我们有匿名类,它允许您在运行时扩展类,包括设置其他属性:

$a = new class() extends MyObject {
    public $property1 = 1;
    public $property2 = 2;
};

echo $a->property1; // prints 1

它不像数组的初始值设定项那样简洁。不确定我是否会使用它。但这是您可以考虑的另一种选择。