在PHP中,我如何将对象元素添加到数组中?

70

我正在使用PHP。我有一个对象数组,并想将一个对象添加到其末尾。

$myArray[] = null; //adds an element
$myArray[count($myArray) - 1]->name = "my name"; //modifies the element I just added

上面的代码是可以工作的,但是有没有更简洁和易读的方式来编写它?也许只需要一行?


3
这个代码不能正常运行。它应该会抛出错误:在stackoverflow的例子中第2行访问了一个空对象的属性。 - Máthé Endre-Botond
3
PHP不在意它是“null”。它会将其转换为对象并设置属性,并发出警告 - nickb
这将会抛出一个空对象警告。 - Sean the Bean
4个回答

134

只需要执行:

$object = new stdClass();
$object->name = "My name";
$myArray[] = $object;

你需要先创建对象(new那一行),然后再将其推入数组末尾([]那一行)。

你也可以这样做:

$myArray[] = (object) ['name' => 'My name'];

然而,我认为这不够易读,即使它更加简洁。


+1 分,因为更易读,但现在变成了三行。我不能在声明中创建对象吗? - adamdport
2
我认为@nickb是正确的,你可以隐式地创建对象,但我不建议这样做,因为这可能会在你执行时引发警告。 - halfer
1
我认为你可以将 (object) 转换为 PHP,即使代码的意图不太清晰。请参见我的答案编辑。 - halfer
1
@adamdport 这取决于你的类的定义。如果它在构造函数中需要一个名称,你可以这样做:$myArray[] = new MyClass("My name"); 但有些对象无法在构造函数中设置所有数据。那么更容易的方法是先创建对象,设置参数,然后再添加它。 - Erk

40

这里是我发现的一种简洁的方法:

$myArray = [];

array_push($myArray, (object)[
        'key1' => 'someValue',
        'key2' => 'someValue2',
        'key3' => 'someValue3',
]);

return $myArray;

9

你真的需要一个对象吗?那么这样做如何:

$myArray[] = array("name" => "my name");

只需使用二维数组。

输出(var_dump):

array(1) {
  [0]=>
  array(1) {
    ["name"]=>
    string(7) "my name"
  }
}

您可以通过以下方式访问您的上一条记录:

echo $myArray[count($myArray) - 1]["name"];

当我尝试访问$myArray [0] [0]时,会出现错误。 - Martin Stein
在上面的例子中,您将使用$myArray[0]["name"],因为第二个项目是一个对象。 - Adam Oates

4

Something like:

class TestClass {
private $var1;
private $var2;

private function TestClass($var1, $var2){
    $this->var1 = $var1;
    $this->var2 = $var2;
}

public static function create($var1, $var2){
    if (is_numeric($var1)){
        return new TestClass($var1, $var2);
    }
    else return NULL;
}
}

$myArray = array();
$myArray[] = TestClass::create(15, "asdf");
$myArray[] = TestClass::create(20, "asdfa");
$myArray[] = TestClass::create("a", "abcd");

print_r($myArray);

$myArray = array_filter($myArray, function($e){ return !is_null($e);});

print_r($myArray);

我认为在某些情况下,这种构造方法比数组更可取。你可以将所有检查逻辑移到类中。

在这里,在调用array_filter之前,$myArray有3个元素。两个正确的对象和一个NULL。调用后,只有两个正确的元素保留下来。


我建议阅读构造函数(function __construct)的相关资料。它们是 PHP 内置的一种方法,可以完成你在示例中所做的工作! - Erk
1
@Erk:方法private function TestClass做的是同样的事情,这是在PHP 4中设置构造函数的旧方法。从PHP 5开始,你的方法更受欢迎。 - halfer
@halfer,今年春天我曾经有过一个时期,认为自己理解了PHP。但是后来我意识到我并没有理解 :D - Erk
@Erk:这是一段永无止境的旅程,无论使用哪种编程语言 :-) - halfer
@halfer,你说得对,当然了,但 PHP 是我遇到的第一种既有又没有的语言。我曾在 PHP 中遇到了它既有又没有的指针,于是现在我正在转向 C# 和 Java :) - Erk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接