Ссылка на массив не работает должным образом в PHP - PullRequest
4 голосов
/ 11 мая 2010

Я смущен результатом следующего кода: я не могу получить ожидаемый результат:

$arrX = array('a'=>array('val'=>10),'b'=>array('val'=>20), 'c'=>array('val'=>30));
foreach( $arrX as &$DataRow )
{
    $DataRow['val'] = $DataRow['val'] + 20;
}
foreach( $arrX as $DataRow )
{
    echo '<br />val: '.$DataRow['val'].'<br/>';
}

Выход: 30, 40, 40

Ожидаемое: 30, 40, 50

Но опять же, если я сделаю небольшую чейджу, все будет хорошо,

$arrX = array('a'=>array('val'=>10),'b'=>array('val'=>20), 'c'=>array('val'=>30));
foreach( $arrX as &$DataRow )
{
    $DataRow['val'] = $DataRow['val'] + 20;
}
foreach( $arrX as &$DataRow )
{
    echo '<br />val: '.$DataRow['val'].'<br/>';
}

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

Вам необходимо сбросить $DataRow после цикла, в котором вы используете его в качестве ссылки:

$arrX=array('a'=>array('val'=>10),'b'=>array('val'=>20), 'c'=>array('val'=>30));
foreach( $arrX as &$DataRow ) {
    $DataRow['val'] = $DataRow['val'] + 20;
}

// at this point $DataRow is the reference to the last element of the array.
// ensure that following writes to $DataRow will not modify the last array ele.
unset($DataRow);

foreach( $arrX as $DataRow ) {
    echo '<br />val: '.$DataRow['val'].'<br/>';
}

Вы можете использовать другую переменную и избежать сброса .. , хотя я бы не рекомендовал ее, поскольку $ DataRow по-прежнему является ссылкой на последний элемент массива, и любая перезапись этого позже вызовет проблемы.

$arrX=array('a'=>array('val'=>10),'b'=>array('val'=>20), 'c'=>array('val'=>30));
foreach( $arrX as &$DataRow ) {
    $DataRow['val'] = $DataRow['val'] + 20;
}

foreach( $arrX as $foo) { // using a different variable.
    echo '<br />val: '.$foo['val'].'<br/>';
}
1 голос
/ 11 мая 2010

Ваш вопрос (почти точно) адресован на странице руководства php foreach:)

http://www.php.net/manual/en/control-structures.foreach.php

http://www.php.net/manual/en/control-structures.foreach.php#92116

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...