Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PHP, Perl, Python Новый топик    Ответить
 PHP - как отменить ссылку?  [new]
Alibek B.
Member

Откуда:
Сообщений: 2988
У меня есть два набора данных ($list и $data) и мне нужно их однонаправленно синхронизировать между собой.
Для этого я построчно обрабатываю второй набор $data, сопоставляя его с первым, а затем дополнительно обрабатываю пропущенные данные из первого набора $list.
Первичная обработка выглядит примерно так:
foreach ($data as &$row)
{
	if (!array_key_exists($row['login'], $list))
	{
		$row['_status'] = 'delete';
		continue;
	}
	$rs = &$list[$row['login']];
	$rs['_status'] = 'linked';
}
foreach ($list as &$rs)
{
	if (array_key_exists('_status', $rs)) continue;
	$row = ['_status'=>'insert', ...];
	$data[] = $row;
}

Но по окончанию первого цикла в $row содержится ссылка на элемент в $data.
И когда я делаю $row=[], то я при этом также изменяю этот элемент в $data.
Если во втором цикле вместо $row использовать новую переменную (например $new), то тогда все работает нормально.
Ну либо можно просто после первого цикла выполнить unset($row), это тоже освободит ссылку.
А можно ли заставить PHP освобождать подобные ссылки автоматически, по завершению цикла?
29 дек 18, 00:52    [21776143]     Ответить | Цитировать Сообщить модератору
 Re: PHP - как отменить ссылку?  [new]
vkle
Member

Откуда: Самара
Сообщений: 14519
Автоматически - вряд ли. По крайней мере, в мануале явно говорится об использовании unset()
http://php.net/manual/ru/control-structures.foreach.php
Внимание Ссылка $value на последний элемент массива останется после окончания цикла foreach. Рекомендуется уничтожать ее с помощью unset().
29 дек 18, 01:38    [21776153]     Ответить | Цитировать Сообщить модератору
 Re: PHP - как отменить ссылку?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 839
array_walk
29 дек 18, 11:33    [21776279]     Ответить | Цитировать Сообщить модератору
Все форумы / PHP, Perl, Python Ответить