Передать массив по ссылке и изменить его значение - PullRequest
0 голосов
/ 25 мая 2018

У меня есть основной вопрос об изменении значений массива внутри функции, скажем, что у меня есть следующий массив внутри класса:

$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 голосов
/ 25 мая 2018

Если вы хотите передать по ссылке и обновить массив внутри имеющегося у вас класса, ваш код должен выглядеть следующим образом:

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());

В качестве грубого примера

0 голосов
/ 25 мая 2018

Может быть, это то, что вы хотите сделать:

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 в основном всегда доступныссылка, вот почему вы должны создавать реальные копии массива вручную, если хотите.

...