Сократить условие

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2015

Есть функция class'a:

 public function blockList() {
  global $db, $avatar_path;

  $template = '';

  $q = $db->query("SELECT `vk_id`, `avatar_id` FROM `users` LIMIT 28");

  $i = 1;

  while($d = $db->assoc($q)) {
   $vk_id = $d['vk_id'];
   $avatar_id = $d['avatar_id'];

   $template .= '
         <div class="user'.(($i == 1 || $i == 5 || $i == 9) ? '' : ' left').'">
          <img src="'.$avatar_path.'/'.$avatar_id.'.png" title="'.($i + 4).'">
         </div>
   ';

   $i++;
  }

  return $template;
 }

Каким образом избавиться от $i == 1 || $i == 5 || $i == 9? Постоянно прописывать так числа не вариант.

Ответы

▲ 1Принят

Если посчитать, что ряд 1, 5, 9 это 4*k+1, то общие у них последние два бита: всегда 01. Можно проверять как-то так:

if( $i & 0b11 ^ 0b01) { // это НЕ 1,5,9 и далее 
} else { // это 1 или 5 или 9 ..
}

Слева направо: оставляем только два младших бита; xor'им с 01. В итоге 0 (false) будет только если число оканчивается на 01, в остальных случаях трансформируется в true.

Ideone