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

How can I make each object unique when creating an array of objects using array_fill?

我正在尝试在 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(...)
]

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

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

$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;

这会在 array 的末尾附加 new Object

在这种情况下,它给出了一个array,从055填充了new Object,例如:

array[10] // -> some object; 
array[35] // -> another object;

PS。 单个命令(如您所说)看起来不错。它不像魔法命令那样工作,而且几乎总是有大量代码"under it"。 唯一的方法,使用内置函数更好,几乎总是这个准备好的 "under code" 比你的快。

这就是为什么我建议继续使用这个简单易读的解决方案,因为所有数组遍历函数等内部也有很多很多行的复杂代码:)。 哪种方法更快,只有基准测试才能判断,但我敢打赌,对于多达 1000 个对象,差异将是 "almost none".


到目前为止,由于该特定示例没有专用功能,您必须在为执行某些操作而优化的功能之一上使用一些 "elegant trick"...让我们说别的。 在那种情况下,此函数的运行速度会慢得多。