вот мой код: http://www.pcgage.net/code.zip (извините, вставка кода заставила его действительно испортиться, даже используя контейнер кода).
Прокрутите до строки: 160 (до 174) – это рассматриваемая петля. Я хочу сделать так, чтобы это была четная часть, а затем некоторый код, чтобы сделать нечетную часть, поэтому цикл повторяется в этом порядке. Причина в том, что я хочу изменить содержимое этого цикла попеременно.
Я не кодер, поэтому самое лучшее, что вы можете сделать, это опубликовать новый код, и я добавлю его туда, где вы мне тоже скажете, иначе я заблужусь 🙂
Надеюсь, что это имеет смысл, если не вы можете проверить более раннюю запись об этой проблеме, которая объясняет, почему мне это нужно (узнав, что только css не может решить мою проблему): css / php: как решить эту проблему с float div / нечетный четный цикл в массиве
это цикл:
} elseif ( ( $findpost->ID ) != $id ) { // all other posts except the current post $serp_list_li[] = '<div class="serial-contain"> <div class=""><h5><a href="' . get_permalink($findpost->ID) . '" title="' . $findpost->post_title . '">' . $findpost->post_title . '</a></h5></div> <div class="text-align">' . $findpost->post_excerpt . ' </div> <div class="date"> ' . mysql2date('M jS, Y', $findpost->post_date) . ' at ' . mysql2date('g:ia', $findpost->post_date) . '</div> <div class="comments"><a href="' . get_permalink($findpost->ID) . '#comments" title="' . $findpost->post_title . '"><b>' . $findpost->comment_count . ' Comments</b></a></div> </div>' . "\n"; } else {
Три способа:
Модульное
for ($i = 0; $i < 10; $i++) { if ($i % 2 == 0) { echo "even"; } else { echo "odd"; } }
Перемещение логического значения
$even = true; for ($i = 0; $i < 10; $i++) { if ($even) { echo "even"; } else { echo "odd"; } $even = !$even; }
И упомянутый логический оператор
for ($i = 0; $i < 10; $i++) { if ($i & 1 == 0) { echo "even"; } else { echo "odd"; } }
Самый быстрый – это логический оператор. Но самый надежный метод flipping, если у вас очень разные числа (например, пробегают идентификационные номера, а некоторые отсутствуют).
Я не просматривал код, но если он использует переменную для подсчета номера цикла, вы можете сделать:
for($i=0;$i<$blah;$i++) if($i&1){ // ODD }else{ // EVEN }
EDIT (1): Я просмотрел раздел, в котором вы работаете, и теперь у меня другая проблема, я не уверен, как вы судите, что должно быть странно или нет, поэтому я предлагаю два ответа:
1: нечетное повторение цикла:
/* Populate the post list array */ // Add here: $oddLoop = false; foreach ($findposts as $findpost): //..... if($oddLoop=!$oddLoop){ // code for odd loop numbers }else{ // code for even loop numbers }
2: Нечетный идентификационный номер:
} elseif ( ( $findpost->ID ) != $id ) { if($findpost->ID & 1){ // ODD }else{ //EVEN }
используя условие внутри цикла:
$class = 'odd'; for(.........) # no problem what kind of loop you are using(for,foreach,while,do) { $class = ($class == 'even' ? 'odd' : 'even'); #some code }
Если вы когда-либо удаляете статью, у вас могут быть проблемы – ваш код предполагает, что идентификатор работает (нечетный, четный, нечетный, четный) и т. Д.
Лучшей идеей было бы создать отдельный объект итератора для подачи необходимых значений на каждом шаге. Вот что я использую:
class LoopingPropertyIterator implements Iterator { private $startat=0, $position=0; private $propertylist=array( 'boolean' => array( false, true ), 'day' => array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'), 'dow' => array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat') ); public function __construct($args, $startat=0) { $this->startat = (int) $startat; $this->position = $this->startat; foreach($args as $name => $arr) $this->__set($name, $arr); } public function __get($name) { if (!array_key_exists($name, $this->propertylist)) throw new Exception(__METHOD__." unknown property $name"); $t =& $this->propertylist[$name]; if (is_array($t)) return $t[ $this->position % count($t) ]; else return $t; } public function __set($name, $arr) { $this->propertylist[$name] = $arr; } public function current() { return $this->position; } public function key() { return $this->position; } public function next() { ++$this->position; } public function rewind() { $this->position=$this->startat; } public function valid() { return true; } }
то ваш результат упрощается до
$iter = new LoopingPropertyIterator( array( 'outerclass' => array('serial-contain-right','serial-contain-left'), 'innerclass' => array('text-align2','text-align') )); ... elseif ( $findpost->ID != $id ) { $link = get_permalink($firstpost->ID); $title = $findpost->post_title; $datetime = mysql2date('M jS, Y', $findpost->post_date).' at '.mysql2date('g:ia', $findpost->post_date); $serp_list_li[]= <<<TEXT <div class="{$iter.outerclass}"> <div class="title"> <h5><a href="{$link}" title="{$title}">{$title}</a></h5> </div> <div class="{$iter->innerclass}">{$findpost->excerpt}</div> <div class="date">{$date}</div> <div class="comments"> <a href="{$link}#comments"> title="{$title}"> <b>{$findpost->comment_count} Comments</b> </a> </div> </div> TEXT; $iter->next(); }
Вы уверены, что $ findpost-> ID содержит порядковые номера?
Вы можете заменить командную строку if / else следующим выражением:
$side = empty($side) || $side == 'right' ? 'left' : 'right'; $serp_list_li[] = '<div class="serial-contain-' . $side . '">' // ...the rest
Сначала это добавит «левую» сторону.
Получить EvenArray и OddArray
NSArray *numberArray = [NSArray arrayWithObjects:@1,@2,@3,@4,@6,@8,@10, nil]; for (id object in numberArray) { if ([object integerValue] % 2 == 0) { [evenArray addObject:object]; } else { [oddArray addObject:object]; } }