Cfloop внутри cfloop?

У меня есть вопрос о моем cfloop внутри другого cfloop. Вот мой код:

<cfloop from="1" to="5" index="k">
    <cfloop from="#qry.S#" to="#qry.E#" index="i" step="#CreateTimeSpan(0,0,qry.Leng,0)#">
        <cfset TimeEnd = dateAdd("n", Leng, i)>
            <tr>
                <td>(#k#) #timeFormat(TimeStart, "hh:mm tt")# - #timeFormat(TimeEnd, "hh:mm tt")#</td>
            </tr>
        <cfset TimeStart = dateAdd("n", qry.Leng, i)>           
    </cfloop>   
</cfloop>

Этот код выше дает мне вывод следующим образом:

    09:00 AM - 09:15 AM
    09:15 AM - 09:30 AM
    09:30 AM - 09:45 AM
    09:45 AM - 10:00 AM
   *10:00 AM - 09:15 AM
    09:15 AM - 09:30 AM
    09:30 AM - 09:45 AM
    09:45 AM - 10:00 AM
   *10:00 AM - 09:15 AM
    09:15 AM - 09:30 AM
    09:30 AM - 09:45 AM
    09:45 AM - 10:00 AM
   *10:00 AM - 09:15 AM
    09:15 AM - 09:30 AM
    09:30 AM - 09:45 AM
    09:45 AM - 10:00 AM
   *10:00 AM - 09:15 AM
    09:15 AM - 09:30 AM
    09:30 AM - 09:45 AM
    09:45 AM - 10:00 AM

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


person espresso_coffee    schedule 09.12.2015    source источник
comment
Какие собственные действия по устранению неполадок вы предприняли? Здесь нет доказательств того, что вы сделали, чтобы попытаться разобраться с этим самостоятельно? Могу ли я порекомендовать вам, по крайней мере, проверить первую итерацию внешнего цикла и проверить свои ожидания. Также предоставьте нам SSCCE (sscce.org), а не просто фрагмент кода. Мы должны иметь возможность запустить пример, который вы устраняете (и это должен быть тот же код, который вы устраняете).   -  person Adam Cameron    schedule 09.12.2015
comment
Я провел много работ по устранению неполадок (разные циклы for, например: cfloop condition=), выводил значения на экран, использовал разные временные интервалы и т. д. Проблема заключалась в том, что я не сбрасывал время вне моего cfloop, который создает временные интервалы. Как только я исправил, моя первая проблема была решена. Теперь у меня проблема, если у меня есть только один временной интервал, мой код дублирует.   -  person espresso_coffee    schedule 09.12.2015
comment
Зачем вы тратите время людей, дважды задавая один и тот же вопрос?   -  person Adam Cameron    schedule 10.12.2015
comment
Вопрос не тот, можно глянуть и найти разницу. Спасибо.   -  person espresso_coffee    schedule 10.12.2015
comment
Это сводится к тому же вопросу: не иметь дескриптора вложенности циклов.   -  person Adam Cameron    schedule 10.12.2015


Ответы (1)


Вы не можете использовать «i» в качестве индекса как для внешнего, так и для внутреннего цикла. Используйте что-то еще для внутреннего цикла (x). Например:

<cfloop from="1" to="5" index="i">
    <cfloop from="#qry.S#" to="#qry.E#" index="x" step="#CreateTimeSpan(0,0,qry.Leng,0)#">
        <cfset TimeEnd = dateAdd("n", Leng, i)>
            <tr>
                <td> #timeFormat(TimeStart, "hh:mm tt")# - #timeFormat(TimeEnd, "hh:mm tt")#</td>
            </tr>
        <cfset TimeStart = dateAdd("n", qry.Leng, i)>           
    </cfloop>   
</cfloop>

Я не уверен в намерении здесь, поэтому вам может потребоваться поменять местами некоторые из вас i на x во внутреннем цикле в зависимости от того, что вам нужно (например, начало-конец).

**************************** правки ****************

Возможно, я вижу вашу проблему (не уверен), но, судя по вашему комментарию, ваша проблема будет заключаться в том, что вы сбросили переменную времени начала. Вам нужно сделать это после начала вашего первого цикла.

<cfloop> outer loop
    <Cfset timestart = *starting value*>
      <cfloop> inner looop

В противном случае ваш timestart будет таким, каким был ваш последний cfset для него - во внутреннем цикле.

person Mark A Kruger    schedule 09.12.2015
comment
Я уже изменил значения индекса, чтобы они были другими. Тем не менее, это не даст мне результат, который я хочу. Мое время начала всегда должно начинаться так же, как и в первый раз, в этом случае 9:00. - person espresso_coffee; 09.12.2015
comment
Я добавил дополнительное редактирование в свой ответ. Дайте мне знать, если это поможет. - person Mark A Kruger; 09.12.2015
comment
Вы были правы, что помогли мне решить проблему со временем начала, но есть еще одна. Если у меня есть несколько временных интервалов, как я показал в своем вопросе выше, мой код теперь работает нормально, но если у меня только время начала 8:00 и время ent 9:00, это должно дать мне 5 временных интервалов в этом случае, но мой код дает мне 10, делает дубликат для каждого k. Может быть, вы знаете, почему это происходит? - person espresso_coffee; 09.12.2015
comment
Очень сложно ответить - возможно, опубликуйте свой исправленный код. Он будет повторяться 5 раз, независимо от того, что основано на приведенном выше коде. в вашем внутреннем цикле вы создаете поплавок как ваш var (это то, что возвращается из createtimespan() ), поэтому трудно точно сказать, что происходит. Попробуйте <cfdump var="#createtimespan(0,0,qry.leng,0)#"> и посмотрите, какую ценность создает ваш шаг. - person Mark A Kruger; 09.12.2015
comment
Чтобы было ясно, что var - это число ... может быть, число с плавающей запятой, вероятно, рассчитанное с определенного времени - может быть, по юлианскому календарю. Вы можете посмотреть, как он генерируется. - person Mark A Kruger; 09.12.2015
comment
Это значение, которое я получил для интервала 5 минут = 0,00347222222222. Есть ли другой способ, как я могу это сделать? Мне нужно два цикла, потому что я вставляю идентификатор из запроса с помощью первого цикла, здесь, например, я просто установил от 1 до 5. - person espresso_coffee; 09.12.2015
comment
Давайте продолжим обсуждение в чате. - person espresso_coffee; 09.12.2015
comment
Если вы используете только минуты, то вместо этого вы можете использовать целые числа, но вам придется больше заниматься математикой :) - person Mark A Kruger; 09.12.2015