通过引用传递数组并更改其值

时间:2018-05-25 15:29:07

标签: php pass-by-reference php-5.6

我在这里有一个关于更改函数内数组值的基本问题,假设我在类中有以下数组:

$my_array = array(1, 2, 3);

然后我有以下方法返回我的数组;

public function getAnArray()
{
    return $this->my_array;
}

然后我想像这样改变一个 my_array 的值(例如2到7)(基于一些业务逻辑):

public function changeArray($my_array)
{
    $new_value = 7;

    foreach($my_array as $key => $value){
        if($value == 2){
            $my_array[$key] = $new_value; // Change the value of 2 to 7
        }
    }
}

现在 $ my_array 变为(1,7,3)

我知道我必须通过引用传递一些内容才能使用,但我不确切知道它应该如何工作。

2 个答案:

答案 0 :(得分:1)

也许这就是你想要做的事情:

class Foo {
    protected $my_array = array(1, 2, 3);

    public function getAnArray() {
        return $this->my_array;
    }

    public function changeArray($new_value,$where_current_value) {
        foreach($this->my_array as $key => $value){
            if($value == $where_current_value){
                $this->my_array[$key] = $new_value; // Change the value of 2 to 7
            }
        }
    }
}

$a = new Foo();

var_dump($a->getAnArray());

$a->changeArray(7,2);

var_dump($a->getAnArray());

结果应符合要求:

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(7)
  [2]=>
  int(3)
}

PHP中的数组基本上总是通过引用访问,这就是你必须手动创建数组的真实副本的原因。

答案 1 :(得分:1)

如果您希望通过引用传递并更新此处所在类中的数组,则代码应如下所示:

foreach($my_array as &$element) {
    if($element == 2) {
        $element = 7;
    }
}

这将根据要求修改原始数组的内容。

虽然看起来你正在课堂上访问它。如果$this->my_array在此类中保持不变,则无需将$my_array传递给changeArray( .. )方法。像这样离开你的班级;

class Foo {

    public $my_array = [1, 2, 3];

    public function getAnArray() {
        return $this->my_array;
    }

    public function changeArray($find, $replace) {
        foreach($this->my_array as &$obj){
            if($obj == $find){
                $obj = $replace; // Change the value of 2 to 7
            }
        }
    }

}

$x = new Foo();

print_r($x->getAnArray());

$x->changeArray(2, 7);

print_r($x->getAnArray());

作为一个粗略的例子