Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 10.11.2016
Сообщений: 2

Цикл не обрабатывает функцию нужное количество раз

13.11.2016, 06:58. Показов 993. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Выдернул кусок рабочего кода из дочерней функции в дебрях самописного контроллера на codeigniter.
Всю ночь не могу понять почему данный кусок (а в реале это функция ) не срабатывает необходимое количество раз указанное в условиях ... Тут подставил массив из 2х значений чтоб легче понять было по отдельности если прописывать вместо $id - цифры то все работает но циклом не хочет (((( а все для этого и писалось чтоб циклом вытаскивать, что for что foreach без разницы, на выходе одна единственная интерация первого значения в массиве $arrr.

на входе все данные в нарисованных и отфильтрваных массивах ( все вроде бы отлажено ), ошибок нет!
На выходе 1 проход по первому значению массива в цикле и все ....

Заранее очень признателен любому отписавшему ....

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
$arrr = array();
$arrr[0] = 1;
$arrr[1] = 2;
foreach ( $arrr as $id )  
          { 
while ($begin <= $end)
{   if ($flag === 0)
    { if ($begin->format("N") === "1")
       { $flag = 1; }
        elseif ($begin->format("N") === "5")
        {
        $flag = 1; }
        elseif ($begin->format("Y-m-d") === date("Y-m-d"))
        {
    //  echo "привет я сегодняшний день";
    //  echo $begin->format("d.m.Y");
        $flag = 1; }
        else {
        $begin->add(new DateInterval("P1D")); }
    } if ($flag === 1) 
        { 
echo '<br>'. $begin->format("Y-m-d");
     
     if ( isset($oplats[$id]))
     { $last_oplata = end($oplats[$id]); // получаем дату последнего оплаченного занятия 
          foreach ( $oplats[$id] as $value )  // цикл обходит массив с оплатами, проверка на оплаты
          { if ($value===$begin->format("Y-m-d"))  // ищет совпадения значений в массиве и даты из интереции текущей цикла
          { echo '<br><span style="color: lime; font-size: 12px">'.$value.'</span>'; // проставляем маркер оплаты
          }  }  
          if ( $last_oplata===$begin->format("Y-m-d")) // проверка на последнее оплаченное занятие
          { echo'<br><span style="color: red; font-size: 12px">Последнее оплаченное</span>'; // проставляем маркер оплаты
          }    
     } if ( isset($proguls[$id]))
         {
          foreach ( $proguls[$id] as $value ) /
          { if ($value===$begin->format("Y-m-d"))  
          { echo '<br><span style="color: orange; font-size: 12px">'.$value.'</span>';  // проставляем маркер оплаты
          }}}
                $begin->add(new DateInterval("P1D"));
        $flag = 0;
 
    }
    } 
          }
Добавлено через 6 часов 8 минут
Если что непонятно спрашивайте , все разжую.
У меня все встало из за этой долбанной функции в неё весь crud дальнейший в моделях упирается.
Загоняется 2 даты (диапазон из 2х дат прогоняется через while ) далее выборка понедельников и пятниц, далее в комментариях кое что описал.
В функции много несколько массивов множество раз "перекроинных" может в этом дело.
В манах php пишут что если в циклах обрабатывается копия масивов то интерация будет 1 разовая и выход из цикла ток я с таким не сталкивался , и ошибок блин нет , чтоб хоть знать куда копать (((

Добавлено через 17 часов 50 минут
РЕШЕНО

Ну что прошли сутки!!!!
Разобрал все построчно с поэтапной отладкой, проблема во вложенном цикле.

Дело в том что при желании вывести 'фором' или 'форычем' цикл while цикл 'валя' материнский цикл срабатывает 1ну интерацию:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$arr = array();
$arr[0] = 1;
$arr[1] = 2;
$arr[3] = 3;
$a = 1;
 
foreach ( $arrr as $id )  
{ echo '<br>'.$id;
 
         while ($a <= 10)
         { echo '('.$a++.')'; }
}
На выходе:
1(1)(3)(5)(7)(9)
2
3
4

Пришлось дочерку Валю менять на форик:

PHP
1
2
3
4
5
6
foreach ( $arrr as $id )  
{ echo '<br>'.$id;
 
for ($a = 1; $a <= 10; $a++)
  { echo '('.$a++.')'; }
}
на выходе:
1(1)(3)(5)(7)(9)
2(1)(3)(5)(7)(9)
3(1)(3)(5)(7)(9)
4(1)(3)(5)(7)(9)

Может для кого то это и не новость но блин к своему стыду за 5 лет впервые наткнулся!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2016, 06:58
Ответы с готовыми решениями:

Копировать строку нужное количество раз
Доброго времени суток. Нужен готовый скрипт, который копирует строку в файл столько раз, сколько написано в числе в начале строки. В php...

Копирование ячеек нужное количество раз
Добрый день! Возник вопрос и никак не могу его решить. Дан файл эксель, на первом листе - таблица, в которой перечислены сотрудники...

Вынуть определенные буквы и вставить нужное количество раз.
problem у чайника: ДАНО: список СЛОВ длинной, допустим, 60 строк. НЕОБХОДИМО: все буквы &quot;а&quot; вынуть и вставить в столбик...

2
 Аватар для Dolphin
814 / 797 / 201
Регистрация: 21.09.2012
Сообщений: 2,656
13.11.2016, 14:54
Цитата Сообщение от Dr_archik Посмотреть сообщение
PHP
1
2
3
4
5
6
$a = 1;
foreach ( $arrr as $id ) *
{ echo '<br>'.$id;
while ($a <= 10)
* * * * *{ echo '('.$a++.')'; }
}
Потому что, после первого цикла $a равна 11 и нигде больше не меняется. Во второй итерации цикла уже не попадаем туда
Надо тогда вот так
PHP
1
2
3
4
5
6
7
foreach ( $arrr as $id )  { 
    echo '<br>'.$id;
    $a = 1;
    while ($a <= 10) { 
        echo '('.$a++.')'; 
    }
}
0
0 / 0 / 1
Регистрация: 10.11.2016
Сообщений: 2
13.11.2016, 17:21  [ТС]
Извините а как объяснить значение 11 ?
Интересная работа цикла, я всегда полагал что итерация в циклах идет сверху вниз ...

Добавлено через 31 минуту
Всё, догнал ... Благодарю за разъяснение, изначально я объявление данной переменной вынес в конфигурационный файл
а цикл for обязывает переопределить условие, оказалось дело не в цикле вот в чем ))))
Окончательная часть кода в моем случае выводит диапазон дат заработал:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$arr = array();
$arr[0] = 1;
$arr[1] = 2;
$arr[3] = 3;
$begin= new DateTime(date("Y-m-d", strtotime('now -3 days')));
$end = new DateTime(date("Y-m-d", strtotime('now +3 days')));
        $data1 = $begin->format("Y-m-d");
        $data2 = $end->format("Y-m-d");
 
foreach ( $arr as $id )
{ 
    echo '<br>'.$id;
$d = new DateTime($data1);
while ( $d->format('Y-m-d') <= $end->format('Y-m-d'))
 { 
$d->modify('+1 DAY');
 
echo '('.$d->format('Y-m-d').')<br>'; }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.11.2016, 17:21
Помогаю со студенческими работами здесь

Как сделать чтобы анимация воспроизводилась нужное количество раз?
Добрый вечер!) Может я не досмотрел где-то или вообще не там искал, но... не хотелось бы изобретать велосипед какой-нибудь... ...

Цикл с предусловием.Вывести на экран n количество раз слово "цикл"
Используя цикл с предусловием (Pascal) вывести на экран n-ное количество раз слово &quot;цикл&quot;.

Цикл проходит не полное количество раз
Происходит импорт Excel файла на сайт, пишу логи в файл, какое количество времени занимает переменная на каждой итерации. Все добавляется,...

Выполнить цикл while указанное количество раз
привет ,как сделать так чтобы цикл количество равное число. то есть while(3){ ну нужно чтобы тогда три итерации }

Повторить цикл указанное количество раз
Пытаюсь написать цыкл который выполнится указанное количество раз, но со сменой одной переменной в нём, и ничего не выходит, подскажите...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru