使用 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
,从0
到55
填充了new Object
,例如:
array[10] // -> some object;
array[35] // -> another object;
PS。 单个命令(如您所说)看起来不错。它不像魔法命令那样工作,而且几乎总是有大量代码"under it"。 唯一的方法,使用内置函数更好,几乎总是这个准备好的 "under code" 比你的快。
这就是为什么我建议继续使用这个简单易读的解决方案,因为所有数组遍历函数等内部也有很多很多行的复杂代码:)。
哪种方法更快,只有基准测试才能判断,但我敢打赌,对于多达 1000 个对象,差异将是 "almost none".
到目前为止,由于该特定示例没有专用功能,您必须在为执行某些操作而优化的功能之一上使用一些 "elegant trick"...让我们说别的。 在那种情况下,此函数的运行速度会慢得多。
我正在尝试在 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
,从0
到55
填充了new Object
,例如:
array[10] // -> some object;
array[35] // -> another object;
PS。 单个命令(如您所说)看起来不错。它不像魔法命令那样工作,而且几乎总是有大量代码"under it"。 唯一的方法,使用内置函数更好,几乎总是这个准备好的 "under code" 比你的快。
这就是为什么我建议继续使用这个简单易读的解决方案,因为所有数组遍历函数等内部也有很多很多行的复杂代码:)。 哪种方法更快,只有基准测试才能判断,但我敢打赌,对于多达 1000 个对象,差异将是 "almost none".
到目前为止,由于该特定示例没有专用功能,您必须在为执行某些操作而优化的功能之一上使用一些 "elegant trick"...让我们说别的。 在那种情况下,此函数的运行速度会慢得多。