Php 使用array_fill创建对象数组时,如何使每个对象唯一?
我试图在Yii2中创建一个对象数组。但是,问题是数组中的对象完全没有区别。以下是我正在尝试的: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:
$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;