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

Php 使用array_fill创建对象数组时,如何使每个对象唯一?,php,arrays,object,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:

我试图在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] => []
    )
]
这是2美元

[
    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(...)
]

请注意,$array2中“Object”后面的数字与$array1中的数字不同。这给我的代码带来了一些问题。我知道我可以简单地做array_push,但是这个特殊的数组可能会变得非常大,我不想使用循环来创建它。如果它可以在一个命令中完成,我真的很想使用这种方法。

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

$n = 56; 
for ($i = 0; $i < $n; $i++) $array[] = new Object;
这会在
数组的末尾追加
新对象

在这种情况下,它给出了一个
数组
,其中填充了从
0
55
新对象
,例如:

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

PS.单个命令(如您所说)看起来很不错。它不像一个神奇的命令,而且几乎总是有大量的代码“在它下面”使用内置函数的唯一方法更好,就是几乎总是这样准备的“代码下”比您的更快。

这就是为什么我建议继续使用这个易于阅读的解决方案,因为所有的数组遍历函数等,里面也有很多很多行复杂的代码:)。 哪种方法更快,只有一个基准可以判断,但我敢打赌,对于多达1000个对象,差异将“几乎没有”



就目前而言,由于该特定示例没有专用函数,您必须对其中一个函数使用一些“优雅的技巧”,这些函数是为执行某些操作而优化的。。。换个说法吧在这种情况下,此函数的运行速度会慢得多。

您的问题是,在PHP中,对象是通过引用隐式传递的,因此
array\u fill
只是将作为第三个参数传递的单个对象添加多次。我想说的是,你只需要使用一个循环(我确信这是
数组填充
内部所做的)好的,它会咬。。。没有聪明的办法解决这个问题?够聪明吗<代码>$array2=范围(0,2);array_walk($array2,函数(&$e){$e=newobject;})@CBroe,这是一个隐式循环。不,在userland.Welp中没有办法绕过隐式或显式循环,如果我不能让数组填充工作,这接近于我计划要做的。我本来打算使用array_push,但这显然更优雅,但在速度方面可能不会有太大不同。写得很好,谢谢!
array[10] // -> some object; 
array[35] // -> another object;