使用array_fill创建对象数组时,如何使每个对象都是唯一的?

时间:2015-01-28 23:18:09

标签: php arrays object

我试图在Yii2中创建一个对象数组。但是,问题是数组中的对象完全没有区别。这是我正在尝试的内容:

$array1 = array(new Object, new Object, new Object);
$array2 = array_fill(0, 2, new Object);

乍一看,它们看起来一样,但输出却没有。

$ ARRAY1

[
    0 => frontend\models\Object#1
    (
        [yii\db\BaseActiveRecord:_attributes] => []
        [yii\db\BaseActiveRecord:_oldAttributes] => null
        [yii\db\BaseActiveRecord:_related] => []
        [yii\base\Model:_errors] => null
        [yii\base\Model:_validators] => null
        [yii\base\Model:_scenario] => 'default'
        [yii\base\Component:_events] => []
        [yii\base\Component:_behaviors] => []
    )
    1 => frontend\models\Object#2
    (
        [yii\db\BaseActiveRecord:_attributes] => []
        [yii\db\BaseActiveRecord:_oldAttributes] => null
        [yii\db\BaseActiveRecord:_related] => []
        [yii\base\Model:_errors] => null
        [yii\base\Model:_validators] => null
        [yii\base\Model:_scenario] => 'default'
        [yii\base\Component:_events] => []
        [yii\base\Component:_behaviors] => []
    )
    2 => frontend\models\Object#3
    (
        [yii\db\BaseActiveRecord:_attributes] => []
        [yii\db\BaseActiveRecord:_oldAttributes] => null
        [yii\db\BaseActiveRecord:_related] => []
        [yii\base\Model:_errors] => null
        [yii\base\Model:_validators] => null
        [yii\base\Model:_scenario] => 'default'
        [yii\base\Component:_events] => []
        [yii\base\Component:_behaviors] => []
    )
]

这是$ array2

[
    1 => frontend\models\Object#4
    (
        [yii\db\BaseActiveRecord:_attributes] => []
        [yii\db\BaseActiveRecord:_oldAttributes] => null
        [yii\db\BaseActiveRecord:_related] => []
        [yii\base\Model:_errors] => null
        [yii\base\Model:_validators] => null
        [yii\base\Model:_scenario] => 'default'
        [yii\base\Component:_events] => []
        [yii\base\Component:_behaviors] => []
    )
    2 => frontend\models\Object#4(...)
    3 => frontend\models\Object#4(...)
]

注意"对象"之后的数字。不像$ array1那样在$ array2中进行更改。这导致我的代码出现一些问题。我知道我可以简单地做array_push,但是这个特定的数组可能会变得非常大,我宁愿不使用循环来创建它。如果可以在一个命令中完成,我真的很想使用该方法。

1 个答案:

答案 0 :(得分:4)

就我而言,就你所说,实现这一目标的更简洁的方法仍然是一个简单的循环:

$n = 56; 
for ($i = 0; $i < $n; $i++) $array[] = new Object;

这是一个行解决方案,我认为它的工作速度非常快......有很多函数可以对数组的每个元素进行操作,但几乎所有函数都按照你描述的方式工作。那么为什么不使用简单的for循环呢?

即使阵列很大(如你所说),我认为这个解决方案没有任何问题。它是一条线,优雅,干净。即使http://www.php.net处的书呆子正在尽一切努力使内置函数快速运行,我也不认为任何内置函数(即使存在)都应该这样做真的快点。我没有测试速度,但我确信几乎没有差别。

然而你的问题非常好,多亏了它,我在php.net手册中阅读了所有的数组函数:http://php.net/manual/en/ref.array.php


我认为代码足够干净,但我会为其他人描述:

$array[] = new Object;

这会在new Object的末尾附加array

在这种情况下,它会为array提供从new Object0的{​​{1}},例如:

55

PS。 单个命令(如你所说)看起来不错。它不像魔术命令一样工作,而且几乎总是有大量代码&#34;在它下面#34;。 唯一的方法,使用内置函数更好,几乎总是这样做准备&#34;在代码&#34;比你快。

这就是为什么我建议使用这个简单易读的解决方案,因为所有的数组漫游功能等都有很多很复杂的代码行:)。 哪种方法更快,只有基准可以说明,但我敢打赌,对于多达1000个对象,差异将是&#34;几乎没有&#34;。


到目前为止,由于该特定示例没有专用功能,您必须使用一些优雅的技巧&#34;关于为做某事而优化的功能之一...让我们说别的。 在这种情况下,此功能的工作速度会慢得多。