Foreach, специальная обработка каждого n:th элемента (например, нечетного)

У меня есть foreach, который выглядит так:

                          foreach ($blogusers as $bloguser) {
                        $args = array(
                        'author' => $bloguser->user_id,
                          'showposts' => 1,
                          'caller_get_posts' => 1
                        );
                        $my_query = new WP_Query($args);
                        if( $my_query->have_posts() ) {
                          $user = get_userdata($bloguser->user_id);
                          userphoto($bloguser->user_id, "<div class='all_authors'><a href='http://blogg.nacka.se/nastasteg/author/".$user->user_login . "'>","</a><ul><li><a href='http://blogg.nacka.se/nastasteg/author/".$user->user_login . "'>" .$user->user_firstname."</a></li><li class='occupation'>".$user->user_lastname."</li></ul></div>", array('width' => 135, 'height' => 135));
                          #echo "<div class='all_authors'><a href='http://blogg.nacka.se/nastasteg/author/".$user->user_login . "'><img src='http://www.gravatar.com/avatar/" . md5( strtolower( trim( " $user->user_email " ) ) )."?s=135' /></a><ul><li><a href='http://blogg.nacka.se/nastasteg/author/".$user->user_login . "'>" .$user->user_firstname."</a></li><li class='occupation'>".$user->user_lastname."</li></ul></div>";
                        }
                      }

В каждом четвертом div хотелось бы добавить дополнительный класс. Как мне это сделать?


person Himmators    schedule 25.10.2010    source источник


Ответы (4)


Используйте оператор модуля. Я вижу, что @Alex опередил меня в этом, но я предлагаю этот код, который я написал и протестировал, чтобы другие могли более четко увидеть принцип:

$blogusers=array('a','b','c','d','e','f','g','h','i','j');
$i=0;
foreach ($blogusers as $bloguser) {
    if($i % 4 === 0) $extraclass= "fourthClass";
    $resultHTML .= "<div class=\"standardClass $extraclass\">$bloguser</div>";
    $i++;
    $extraclass="";
}
echo $resultHTML;

Можно сделать более компактным с тернарным оператором, но это принцип.

person norwebian    schedule 25.10.2010

Создайте переменную перед вашим foreach с именем $i и установите для нее значение 0;

Внутри вас для каждого использования

$class = ($i%4 === 0) ? 'yourclass' : '';

$class теперь либо «ваш класс», либо пустая строка

Затем в конце вашего приращения foreach $i с $i++

person Alex    schedule 25.10.2010
comment
+1 за использование оператора модуля - person Richard Marskell - Drackir; 25.10.2010

Я бы посмотрел на создание локальной переменной перед циклом, увеличение на каждой итерации цикла, на значительной итерации цикла, выполнение действий и сброс до 0

person RobotHumans    schedule 25.10.2010

Добавить к нему счетчик, возможно?

$counter = "";
foreach($array AS $variable){
  $counter +=1;
  // Here you will do your standard stuff you do always
  if($counter == 4){  // check for right counter value
    $counter = "";  // null the counter again
    // HERE you can do stuff that only happens every 4th iteration
  }
  // HERE you can carry on with your usual stuff that happens always
}

Конечно, есть много разных способов сделать это, это, на мой взгляд, самый простой.

person nana    schedule 25.10.2010
comment
Может быть, это раздражает, но ""!==NULL. если это счетчик, установка его на 0 более уместна. Работать конечно будет, вопросов нет. - person Wrikken; 25.10.2010
comment
Ты прав. Я знаю, что это немного грязно :) Я склонен делать это, потому что по какой-то причине, когда я позже просматриваю свой код, мне несколько легче найти этот 0. Думаю, я должен попытаться быть чище, по крайней мере, здесь, помогая другим народ ;) Спасибо, что напомнили. - person nana; 25.10.2010