Использование ссылки при преобразовании строкового массива в целочисленный массив в PHP приводит к неожиданному выводу?

Скажем, у нас есть этот массив строк:

$arrString = ["1", "2", "3"];

Один из традиционных способов преобразования значений в целые числа выглядит так:

foreach ($arrString as $key => $value)
    $arrString[$key] = (int) $arrString[$key];

echo var_dump($arrString);

Это выводит:

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

Ожидается много. Однако я считаю, что использование ссылки — это гораздо более быстрый способ выполнить ту же работу:

foreach ($arrString as &$strValue)
    $strValue = (int) $strValue;

 echo var_dump($arrString);

Ну угадайте, что он выдает?

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

То есть он присвоил последнее значение как ссылку на int. Это всегда происходит с последним элементом при использовании ссылки в цикле (даже когда есть только один элемент), и это также происходит независимо от того, использую ли я (int) cast или функции PHP settype- и intval.

Это бьет меня; Почему это происходит? И я действительно должен заботиться?


person Martin Andersson    schedule 28.05.2012    source источник
comment
к вашему сведению- array_walk($arr, 'intval');   -  person goat    schedule 28.05.2012


Ответы (1)


Вы должны заботиться, и это было объяснено много раз здесь, на SO (и в документации PHP есть явное предупреждение)

Do

unset($strValue);

после цикла

Подробнее см. здесь.

ИЗМЕНИТЬ

Справочник

с цитатой:

Предупреждение

Ссылка на $value и последний элемент массива остаются даже после цикла foreach. Рекомендуется уничтожить его с помощью unset().

person Mark Baker    schedule 28.05.2012