2016-12-15 4 views
1

Существует эта функция принимает $feedback аргументов по ссылке и его модификации:Clone массив передается по ссылке

private function removeEmptyAnswers(&$feedback) 
{ 
    //Do stuff with $feedback 
} 

Я хотел бы сделать копию $feedback прежде чем он будет изменен, чтобы зарегистрировать ее:

private function removeEmptyAnswers(&$feedback) 
{ 
    $feedbackCopy = $feedback; 
    //Do stuff with $feedback 
    MyLog::write(['before' => $feedbackCopy, 'after' => $feedback]); 
} 

Это было бы арахис, если $feedback были переданы по значению, но передаются по ссылке, а это означает, что мой $feedbackCopy также переодеваться .. или нет?

Странно, чтобы не найти решения для этого после 30 минут поиска в Интернете.

Как сделать копию массива, которая передается по ссылке?

+1

'$ feedbackCopy' не будет изменен при изменении' $ feedback'. https://3v4l.org/072Pi Поэтому вам ничего не нужно менять. – Yoshi

ответ

3

Достаточно просто назначить массив другой переменной.

$original = [1, 2, 3]; 
function meh (&$arr) { $copy = $arr; $copy[0] = 'meh'; } 
meh($original); 
var_dump($original); // unchanged 

function meh1(&$arr) { $arr[0] = 'meh'; } 
meh1($original); 
var_dump($original); // changed 

Исходный массив в этом случае не изменяется, как вы видите. Но если вы измените аргумент, он будет изменен, как и ожидалось.

Также см. this question для получения дополнительной информации, как предложено AnthonyB.

+0

И еще раз PHP генерирует * наименее ожидаемый результат *. Спасибо. –

+1

Действительно, если вы видите [здесь] (http://stackoverflow.com/questions/2840112/php-making-a-copy-of-a-reference-variable), если вы копируете ссылку без ссылочной операции, эталонная копия не является ссылка. – AnthonyB