在执行以下代码时,我只得到最后一个值。请帮助我获取正确的值。
$formJsonMemData = (object) array();
$array_member = array();
echo'<pre>';
for($i=0;$i<10;$i++)
{
$formJsonMemData->i = $i;
$array_member[]=$formJsonMemData;
}
print_r($array_member);
当前输出
[1] => stdClass Object
(
[i] => 4
)
[2] => stdClass Object
(
[i] => 4
)
[3] => stdClass Object
(
[i] => 4
)
[4] => stdClass Object
(
[i] => 4
)
我需要像
那样打印[1] => stdClass Object
(
[i] => 1
)
[2] => stdClass Object
(
[i] => 2
)
[3] => stdClass Object
(
[i] => 3
)
[4] => stdClass Object
(
[i] => 4
)
答案 0 :(得分:0)
您可以在每次迭代时重新定义对象
$array_member = array();
echo'<pre>';
for($i=0;$i<10;$i++){
$formJsonMemData = (object) array();
$formJsonMemData->i = $i;
$array_member[$i] = $formJsonMemData;
}
print_r($array_member);
答案 1 :(得分:0)
您看到的是按引用和按值之间的区别。
当您将变量(或数组元素)设置为等于对象的属性时,您实际上是在说您希望它成为现在的值,而不是当时的值。它被分配了。
要获得您期望的行为,必须按值而不是按引用传递属性的内容。一个getter方法可以做到这一点:
class formJsonMemData {
private $i;
public function __construct() {
}
public function set_i($i) {
$this->i = $i;
}
public function get_i() {
return $this->I;
}
}
$array_member = array();
$f = new formJsonMemData;
for($i=0;$i<10;$i++)
{
$f->set_i($i);
$array_member[]=$f->get_i();
}
print_r($array_member);
答案 2 :(得分:0)
在代码的第一行上,创建一个对象并将其分配给$formJsonMemData
。然后,您的代码将循环运行,并在每次迭代之前设置对象的i
属性,然后再将其添加到数组$array_member
中。
您遇到的问题是,默认情况下对象是通过引用传递的。您需要在每次迭代中设置i
的值,但是数组中的所有元素都指向同一对象。在循环结束时,您没有10个对象,每个对象都有自己的i
值。您拥有10次相同的对象,并且每次迭代都对其进行了更新。
目前尚不清楚代码的目标是什么,因此很难提出最佳解决方案。如果您想要一个对象数组,每个对象都有自己的i
属性,那么在循环的每次迭代中都需要一个新实例。
示例:
$array_member = array();
for ($i = 0; $ < 10; $i++) {
$new_object = new stdClass();
$new_object->i = $i;
$array_member[] = $new_object;
}
进一步阅读:https://www.php.net/manual/en/language.oop5.references.php