Получение первого элемента из цикла For

Я пишу свой собственный компонент Joomla (MVC), он в значительной степени основан на модуле новостей, потому что я хочу отображать последние 5 элементов контента в интерфейсе со скользящими вкладками, вся тяжелая работа выполнена, но мне очень трудно получить контент. из цикла for.

Вот код, который у меня есть до сих пор default.php

<ul id="handles" class="tabs">
    <?php for ($i = 0, $n = count($list); $i < $n; $i ++) :
            modSankeSlideHelper::getTabs($list[$i]);
     endfor; ?>                
<li class="end"></li>
</ul>

helper.php

function getTabs(&$item)
{
    global $mainframe;

    $item->created     = $item->created;

    list($year, $month, $day) = split("-", $item->created);
    $tabdate = date('d\/m\/y', mktime(0, 0, 0, $month, $day, $year));

    require(JModuleHelper::getLayoutPath('mod_sankeslide', '_tab'));
}

_tab.php

<li><a href="#tab"><span><?php echo 'Shout ' . $tabdate; ?></span><b></b></a></li>

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

Я пытался использовать оператор if $i = 0 else в default.php, но по какой-то причине это привело к тайм-ауту страницы!

Есть идеи?


person Paul M    schedule 26.10.2008    source источник


Ответы (3)


Вы сказали, что пробовали if $i = 0, оператор сравнения в PHP – это ==, с вашим, если у вас есть бесконечный цикл, поскольку на каждой итерации вы присваиваете $i значение 0, и оно никогда не достигает $n, вы должны сделать внутри своего цикла:

if ($i == 0){
  // First Item here...

}else{
  // Other Items...

} 
person Christian C. Salvadó    schedule 26.10.2008
comment
Не вызовет ли использование старого трюка 0 == $i ошибку интерпретатора, так что этот старый трюк C станет полезной парадигмой и для PHP? - person tvanfosson; 26.10.2008
comment
Я наградил вас правильным ответом, хотя у тванфоссена была хорошая идея. Но вы указали на главную ошибку страшного двойного равенства. Я новичок в этом, и не могу поверить, что пропустил!! Спасибо, что указали на это! - person Paul M; 26.10.2008

Я думаю, что @CMS правильный.

Вы также можете подумать об обработке первого элемента вне цикла и позволить циклу обрабатывать остальные элементы. Таким образом, вам не нужно выполнять проверку при каждом проходе цикла.

person tvanfosson    schedule 26.10.2008
comment
tvanfosson, хорошая идея, но мне нужно использовать тот же список элементов позже на той же странице, поэтому я не могу ничего сбросить, хотя я пытался скопировать его и сбросить, но это испортило mktime!! В любом случае большое спасибо, - person Paul M; 26.10.2008
comment
Я просто хотел, чтобы индекс цикла начинался с 1, а не с 0. Выполните первый элемент до начала цикла. - person tvanfosson; 26.10.2008

Если вы используете простой цикл for, я бы рекомендовал просто воздействовать на 1-й элемент, а затем перебирать остальные как tvanfosson сказал. Это немного быстрее и потенциально легче читать...

doSomethingWithFirst($list[0]);

for ($i = 1; $i < count($list); $i++) {
    doSomethingWithTheRest($list[$i]);
}

Я склонен использовать foreach вместо for для перебора массивов, и в этом случае я бы использовал переменную "firstDone", например:

$bFirstTime = true;
foreach($list as $item) {
    if ($bFirstTime) {
        doSomethingWithFirst($item);
        $bFirstTime = false;
    } else {
        doSomethingWithTheRest($item);
    }
}
person enobrev    schedule 26.10.2008