Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
8 / 8 / 3
Регистрация: 06.12.2013
Сообщений: 200

Цикл foreach() не могу понять

22.02.2017, 19:26. Показов 1436. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Уже не первый год программирую на PHP и не думал, что возникнет сложность с циклом foreach(). Но факт есть факт, уже несколько часов ничего не могу понять

Есть у меня 2-х мерный индексированный массив. У него 32 элемента. В каждом элементе сидит массив с 12 элементами.
Что я делаю:
1. Переворачиваю массив "с ног на голову" array_reverse($mass). Смотрю массив - все ОК.
2. Прохожу массив в цикле foreach ($mass as $key => &$value). Ставлю '&' т.к. мне нужно вносить поправки в значения элементов.
3. После этого смотрю массив, который у меня перевернут "с ног на голову". Последнего элемента нет, он куда-то исчезает, а вместо него дублируется предпоследний, т.е. 2 абсолютно одинаковых подмассива в элеменах 31 и 32.

4. На этом история не заканчивается. Снова переворачиваю массив "с головы на ноги" array_reverse($mass). И снова все ОК. Элемент который исчезал снова появляется на своем теперь уже 1-ом месте, где и был в самом начале. Ничего не понимаю... Что может быть не так?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2017, 19:26
Ответы с готовыми решениями:

Не могу разобраться с циклами (не могу понять как сделать так чтоб цикл считывал каждый элемент, без массива!)
Натурально число а вводится пользователем.Определить количество не нудевых цифр этого числа . Не используя массивы!

Цикл do while не могу понять,
программу которая принимает число N и выводит на экран N звездочек, использовать цикл do while

Обработка XML. Цикл foreach (XmlNode.) вложенный во внешний foreach
Здравствуйте. Возникла проблема при обработке XML-файла (с помощью XMLDocument). В теме я новичок. Имеется XML файл такого типа: ...

2
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
22.02.2017, 19:37
Минимальный рабочий код демонстрирующий проблему в студию.
0
8 / 8 / 3
Регистрация: 06.12.2013
Сообщений: 200
22.02.2017, 20:09  [ТС]
Лучший ответ Сообщение было отмечено М_Сергей как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
$k = 0;
while ($row = $result->fetch_assoc())
    {
        $partsData[$k]['id1'] = $row['id1'];
        $partsData[$k]['id2'] = $row['id2'];
        $partsData[$k]['id3'] = $row['id3'];
        $partsData[$k]['id4'] = $row['id4'];
        $partsData[$k]['partName'] = $row['partName'];
        $partsData[$k]['logoName'] = $row['logoName'];
        $partsData[$k]['dirName'] = $row['dirName'];
        $partsData[$k]['line1'] = 'line';
        $partsData[$k]['line2'] = 'line';
        $partsData[$k]['line3'] = 'line';
        $partsData[$k]['close'] = 'middleClosePart';
        $partsData[$k]['open'] = 'middleOpenPart';
        $k++;
    }
 
 
    $partsData = array_reverse($partsData);
 
    foreach ($partsData as $key => &$value)
    {
        
        if (!isset($maxId1))
            $maxId1 = $value['id1'];
 
        if ($value['id1'] == $maxId1 && $value['id2'] != 0)
            $value['line1'] = 'space';
 
        if ($value['id1'] == $maxId1 && $value['id2'] == 0)
        {
            $value['close'] = 'bottomClosePart';
            $value['open'] = 'bottomOpenPart';
        }
 
        
        if ($value['id1'] != $id1)
            $checkChangeId1 = true;
        else
            $checkChangeId1 = false;
        $id1 = $value['id1'];
 
        if ($checkChangeId1 && $value['id2'] != 0)
            $maxId2 = $value['id2'];
 
        if ($value['id2'] == $maxId2 && $value['id3'] != 0)
            $value['line2'] = 'space';
 
        if ($value['id2'] == $maxId2 && $value['id3'] == 0)
        {
            $value['close'] = 'bottomClosePart';
            $value['open'] = 'bottomOpenPart';
        }
 
        //линия на 3-ем уровне
        if ($value['id2'] != $id2)
            $checkChangeId2 = true;
        else
            $checkChangeId2 = false;
        $id2 = $value['id2'];
 
        if ($checkChangeId2 && $value['id3'] != 0)
            $maxId3 = $value['id3'];
 
        if (isset($maxId3) && $value['id3'] == $maxId3 && $value['id4'] != 0)
            $value['line3'] = 'space';
 
        if (isset($maxId3) && $value['id3'] == $maxId3 && $value['id4'] == 0)
        {
            $value['close'] = 'bottomClosePart';
            $value['open'] = 'bottomOpenPart';
        }
    }
В самом начале цикл переносит результат из БД в массив, а дальше я его обрабатываю.

Добавлено через 11 минут
Еще заметил вот какую особенность. Если весь этот цикл foreach() убрать, то этой ошибки нет. Если удалить этот злополучный '&', без которого я не смогу внести корректировки в значения элементов, то тоже все хорошо. Может многомерные массивы какой глюк выдают с этим знаком?

Добавлено через 10 минут
Сам нашел причину проблемы. Если кому интересно на будущее...
https://habrahabr.ru/post/136835/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2017, 20:09
Помогаю со студенческими работами здесь

Не могу понять, почему не работает цикл for
Есть график, в котором очень много точек (в перспективе пару тысяч). Но мне надо вывести последние 50 из списка. Пишу: for (var i =...

Не могу понять как правильно описать цикл
Помогите пожалуйста. Не могу понять как правильно описать цикл. С помощью метода: Найти количество столбцов, начинающихся с ...

JQuery!? Не могу понять почему цикл не срабатывает?
for (var b=1; b<=1; b++) { $('#lab_'+b).click(function(){ $('#cng_'+b).attr("disabled",false); }); } вот если это без...

Нарисовать ромб через цикл,почти сделал,не могу понять что делать дальше
#include <iostream> #include <math.h> #include <conio.h> using namespace std; int main() { int N,i; N=10; for...

Как переделать данный цикл for во вложенный цикл foreach?
Добрый день, как переделать данный цикл во вложенный цикл foreach? for (i in 0 until fieldPos.size) { for (j in 0...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru