Неявное изменение массива в php

1 Авг
2012

Хочу поделиться примером неявного изменения массива в php, на которое напарывался несколько раз. И вот сейчас окончательно выделил метод решения.

Проблема


Пример 1. Содержит ошибку:
$a = array(1,2);
foreach($a as &$b);
foreach($a as $b);
var_dump($a);


Данный код выведет следующее:
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(1)
}

Почему так?

Первый цикл создает переменную $b, указывающую на последний элемент из массива $a. Однако она не самоубьется после цикла, а останется жить.
Далее. Второй цикл при первой итерации записывает в существующую переменную $b первое значение из массива $a. Однако переменная $b не является настоящей переменной. Она указывает на последний элемент из массива. Куда и записывается наша единица.

Решение


Использовать unset на переменную после цикла, чтобы убить ссылку.
$a = array(1,2);
foreach($a as &$b);
unset($b);
foreach($a as $b);
var_dump($a);

Результат:
array(2) {
  [0] =>
  int(1)
  [1] =>
  int(2)
}

Что и ожидалось.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх