Эта тема на forum.dklab.ru


DmitryDklab: Не изменяется элемент массива
Возникла проблема :(
Во вложенном цикле изменяю значение одного из элементов массива.
Смотрю тут же - значение новое.
А во "внешнем" цикле выводится старое значение!!!
Никак не пойму почему...


foreach($sql_insert_str as $sql_index => $sql_query)
{
echo($sql_index."=>".$sql_query."<BR>"); // Здесь выводится "старое" значение :(
require('_connect.incl');
$sql_id = ($sql = mysql_query($sql_query)) ? mysql_insert_id() : NULL;
mysql_close($db);
if (!$sql)
{
?>
<script>
parent.ErrorMessage = parent.ErrorMessage + "<span style='background-color=#FFCCCC'>Ошибка добавления строки!</span><BR>";
parent.serviceFrame.document.location = "service_page.html";
</script>
<?php
}
else
{
?>
<script>
parent.ErrorMessage = parent.ErrorMessage + "<span style='background-color=#AAFFAA'>Строка добавлена. (id=<?php echo($sql_id); ?>)</span><BR>";
parent.serviceFrame.document.location = "service_page.html";
</script>
<?php
foreach($sql_insert_str as $sql_id_index => $sql_id_query)
{
if($sql_id_index > $sql_index)
{
$sql_insert_str[$sql_id_index] = str_replace($id_table[$sql_index], $sql_id, $sql_id_query); // Здесь - новое значение!
echo("- ".$sql_id." - ".$sql_insert_str[$sql_id_index]."<BR>");
}
}
}


kernel32:
конструкция foreach() работает не с самим массивом, а с его копией, созданной до начала цикла.
DmitryDklab:
Спасибо!
Надо же - какие "засады" бывают в коде :)
zaxar:
То ли я дурачок, то ли в данном случае проблему решает амперсанд! По крайней мере, с амперсандом у меня всегда такие случаи прокатывали...
DmitryDklab:
Можно поподробнее.
Я попробую...
zaxar:

Можно поподробнее.
Я попробую...


Постараюсь объяснить.
Берем, например, такой скрипт.


<?
$data=array(1,2,3,4,5,6,7,8,9); //Создаем массив из 9 чисел.
foreach($data as $value) $value+=10; //В цикле прибавляем 10 к каждому числу.
print_r($data); //Распечатываем массив. Ожидаем, что там будет 11,12,13... Но ничего не выходит
?>


Теперь перед $value добавляем амперсанд, который говорит о том, что мы работаем с самим значением, а не с его копией.


<?
$data=array(1,2,3,4,5,6,7,8,9); //Создаем массив из 9 чисел.
foreach($data as &$value) $value+=10; //В цикле прибавляем 10 к каждому числу.
print_r($data); //Распечатываем массив. Вот теперь получилось. 11,12,13 и т.д.
?>

kernel32:
Теперь перед $value добавляем амперсанд, который говорит о том, что мы работаем с самим значением, а не с его копией.
Знаю такой метод... Но, по-моему, он работает только в PHP5.

Эта тема на forum.dklab.ru