循环时出现数组对象问题

时间:2019-07-18 02:20:31

标签: php

在执行以下代码时,我只得到最后一个值。请帮助我获取正确的值。

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

3 个答案:

答案 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