2012-04-04 6 views
2

Следующий код, который отображает значение из массива, представляет разные результаты при обертке в foreach(), а не в том случае, когда я использую простой цикл for. Цикл for представляет правильные данные, но foreach(), кажется, изменяет входной массив с каждой итерацией.PHP foreach() изменяет массив

$arr = array_merge($arr1, $arr2); 

for ($x = 0; $x < count($arr); $x++) { 
    echo $arr[90]['circread_value']; 
} 

foreach ($arr as $unused) { 
    echo $arr[90]['circread_value']; 
} 

Выход из для цикла имеет то же значение, снова и снова (как ожидалось):

1382429.00 
1382429.00 
1382429.00 
1382429.00 
... 

Выхода из Еогеаспа() показывает, что 91-й элемент в массиве является с каждой итерацией:

56256.00 
45652.00 
50726.00 
317896.00 
... 

Как это может быть?

Примечание: Я знаю, что приведенный выше код является надуманным (очевидно, внутри foreach() Я на самом деле желаю продолжить обработку и ссылаюсь на каждый элемент массива, который я выполняю, а не просто на 91-й . элемент) я просто сократил обратно код на что-то простое (как часть моей отладки, так же как и для размещения здесь)

Некоторая дополнительная информация:

  • $ обр была создана array_merge» используя два массива из 91 элементов для создания массива элементов 182.
  • Поведение, которое я вижу, происходит только для 91-го элемента - если я выхожу из $ arr [89] ['circread_value'] или $ arr [91] ['circread_value'], я получаю согласованные значения из foreach() слишком.
  • В (казалось бы, случайная) ценностью, которые я вижу в Еогеаспе() на самом деле является значение от других элементов в массиве (массив, как он выглядит перед началом Еогеаспа)

входные массивы ($ arr1 и $ arr2) можно найти здесь: http://pastebin.com/wQN8XXu2

Спасибо за понимание. Не стесняйтесь обращаться за дополнительной информацией.

+0

Интересно. Каков вывод 'var_dump' для каждой итерации цикла? – knittl

+0

Вы говорите, что вы выполнили * точный * код выше с вашими данными, и вы видите эту проблему? – DaveRandom

+0

Я [не могу повторить] (http://codepad.viper-7.com/eHzDf2) this ... PHP version please – DaveRandom

ответ

0

Еогеасп изменяет внутренний указатель массива, для не делает, потому что он ожидает от вас целое смещение, о чем свидетельствует здесь http://us3.php.net/manual/en/control-structures.foreach.php

«Как Еогеасп опирается на внутренний указатель массива изменяя его внутри цикла может привести к неожиданному поведению ».

+1

'foreach модифицирует указатель внутреннего массива' - Нет, нет. 'foreach' работает с копией массива, поэтому вы должны использовать ссылки (a la' foreach ($ arr as & $ val) '), чтобы изменить исходный массив. И все равно это не имеет значения, он ссылается на ценности статически. – DaveRandom

+1

есть. http://us3.php.net/manual/en/control-structures.foreach.php – menacingly

+1

Да, это так: http://php.net/manual/pt_BR/control-structures.foreach.php. Дело в том, что он сбрасывается только один раз, в начале цикла. В этом случае это не имеет никакого значения. –

0

С вашим братом кода что-то не так.

Я только tested this:

$arr = array(
    0 => array('blah' => 123.42), 
    1 => array('blah' => 5488.87), 
    90 => array('blah' => 669874.923) 
); 

for ($x = 0; $x < count($arr); $x++) { 
    echo $arr[90]['blah'] . PHP_EOL; 
} 

foreach ($arr as $unused) { 
    echo $arr[90]['blah'] . PHP_EOL; 
} 

И выводит нормально:

669874.923 
669874.923 
669874.923 
669874.923 
669874.923 
669874.923 

Вы не возражаете, показывая нам немного больше кода?

+0

Спасибо - я сдам весь контент реального массива и опубликую его в ближайшее время (массив примеров не является точным массивом). –

0

Неисправность. Этот 91-й элемент массива был фактически ссылкой на массив. Затем foreach использовал одно и то же имя переменной (ссылка на тот же массив - с именем $ unused в фрагменте примера, который я дал в вопросе), так что оба они смотрели на один и тот же массив.

Мы заметили «&» в дампе массива после размещения его здесь для вас, так что StackOverflow помог нашему процессу отладки ... спасибо за вклад каждого.

Смежные вопросы