【问题标题】:In PHP, how can I add an object element to an array?在 PHP 中,如何将对象元素添加到数组中?
【发布时间】:2013-01-12 09:33:24
【问题描述】:

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

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

上面是函数式的,但是有没有一种更简洁、更易读的方式来编写它?可能是一行?

【问题讨论】:

  • 这无法正常工作。它应该抛出一个错误:Accessing property of a null object at line 2 in stackoverflow example
  • @sinistraD - PHP 不在乎它是 null。它会将其转换为对象并设置属性,然后emit a warning
  • 这将引发空对象警告。

标签: php arrays object


【解决方案1】:

只要做:

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

您需要先创建对象(new 行),然后将其推送到数组的末尾([] 行)。

您也可以这样做:

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

但我认为它不那么可读,即使它更简洁。

【讨论】:

  • +1 以提高可读性,但现在是三行。我无法在声明中创建对象?
  • 我认为@nickb 是对的,您可以隐式创建对象,但我不推荐这样做,因为这样做可能会引发警告。
  • 我认为您可以将 (object) 转换为 PHP,即使代码的意图不太清楚。请参阅我的答案编辑。
  • @adamdport 这取决于你的类的定义。如果它在其构造函数中使用名称,您可以这样做:$myArray[] = new MyClass("My name"); 但有些对象将无法在构造函数中设置所有数据。然后创建对象,设置参数,然后添加就更容易了。
【解决方案2】:

这是我发现的一个干净的方法:

$myArray = [];

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

return $myArray;

【讨论】:

    【解决方案3】:

    你真的需要一个对象吗?怎么样:

    $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] 时出现错误。
    • @MartinStein 在上面的示例中,您将使用 $myArray[0]["name"] 因为第二项它是一个对象。
    【解决方案4】:

    类似:

    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。调用后,仅保留 2 个正确的元素。

    【讨论】:

    • 我建议阅读构造函数 (function __construct)。它们是按照您在示例中所做的事情而构建的 PHP!
    • @Erk:private function TestClass 方法做同样的事情,这是 PHP 中设置构造函数的旧方法(来自 PHP 4)。从 PHP 5 开始,首选您的方式。
    • @halfer,今年春天我有一段时间以为我了解 PHP。从那以后我意识到我没有:D
    • @Erk:这是一个永无止境的旅程,可以使用任何语言:-)
    • @halfer,当然,你是对的,但 PHP 是我遇到的第一个既是又不是同时存在的语言。我在 PHP 有和没有的指针上崩溃并烧毁了,所以现在我回到 C# 和 Java :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多