| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > foreach |
| Автор: race1 28.10.2008, 17:17 | ||||
Как известно, переменная $cur_value не удаляется после выполнения цикла. Это понятно, но почему не работает такой же foreach если вызвать его просто второй раз? Т.е.
Просто интересно разобраться, почему так. Разве $cur_value во втором цикле не будет просто перезаписана? И почему правильно работает если использовать ссылку. Вообще в реальном примере $array это массив массивов массивов, но думаю это не очень важно... Спасибо. |
| Автор: HackMan 28.10.2008, 17:39 |
как-то удивительно, что оно у тебя вообще что-то выводит |
| Автор: teroni 28.10.2008, 17:41 |
| Что-то вы намудрили... У меня этот код 123 три раза вывел... Только объявление массива неправильное конечно. У Вас действительно ЭТОТ код печатал во втором цикле 113? |
| Автор: HackMan 28.10.2008, 17:43 |
| этот код кроме Parse error ничего не печатает вовсе |
| Автор: race1 28.10.2008, 17:51 | ||||
Насчёт объявления массива это моя ошибка, надо конечно так:
Насчёт реального кода. Да, один foreach для вывода значений массива. В массиве 4 элемента, на выходе было два первых элемента, потом 3-й и 4-й. Сам массив что-то вроде этого:
Выводил $cur_value['id'] и $cur_value['name'] |
| Автор: HackMan 28.10.2008, 17:59 |
| |
| Автор: race1 28.10.2008, 18:42 | ||||
| Угу Есть один файл, который подключает несколько других. Один из этих файлов - левое меню. Там из базы формируется массив который я скопипастил в предыдущем посте, и он выводится через foreach:
В другом файле мне опять надо вывести эти же категории, опять foreach и теже названия переменных:
Вот здесь-то и проявляется косяк, элементы массива выводились два раза первый, потом третий и 4-й. |
| Автор: Nigel 28.10.2008, 21:27 |
| При каждой итерации цикла смещается внутренний указатель массива, однако foreach при запуске делает reset. Вероятно, у вас где-то ошибка в реализации. По-моему, удобнее в вашем случае использовать http://ru2.php.net/manual/ru/function.array-walk.php или http://ru2.php.net/manual/ru/function.array-walk-recursive.php |
| Автор: sTa1kEr 29.10.2008, 09:51 | ||||
| race1, первые два цикла у вас в примере полностью рабочие, а вот последнем есть распространенная ошибка (думаю из-за этого у вас и проблемы): Нужно всегда помнить, что операция по присвоению жесткой ссылки всегда затрагивает обе переменные (они обе помечаются, как "переменная переданая по ссылке") до тех пор пока существует более одной ссылки на значение переменной. А приводит это к тому, что поведение таких переменных несколько отличается, а именно в данном случае это приводит к тому, что последний элемент в массиве будет передаваться по ссылке при копировании массива! Пример:
Есть и еще ряд других проблем связанных с амперсандом, по этому крайне желательно избегать их использование. Но если это необходимо, то удалять сразу после использования:
|
| Автор: race1 30.10.2008, 15:51 |
| Спасибо, стало понятнее! |