PHP: как добавить нечетный / четный цикл в массиве - PullRequest
8 голосов
/ 10 сентября 2009

вот мой код: http://www.pcgage.net/code.zip (извините, при вставке кода он действительно испортился даже при использовании контейнера кода).

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

Я не кодер, поэтому лучшее, что вы можете сделать, это опубликовать новый код, и я добавлю его туда, где вы мне тоже скажете, иначе я потеряюсь :) 1007 *

Надеюсь, что это имеет смысл, если нет, вы можете проверить более раннюю публикацию об этой проблеме, которая объясняет, почему я нуждаюсь в этом (после того, как выяснилось, что один только css не может решить мою проблему): css / php: как решить этот 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 {              

Ответы [ 6 ]

34 голосов
/ 10 сентября 2009

Три способа

Modulo

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";
  }
}

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

8 голосов
/ 10 сентября 2009

Я не просматривал код, но если он использует переменную для подсчета номера цикла, вы можете сделать:

 for($i=0;$i<$blah;$i++)
   if($i&1){
     // ODD
   }else{
     // EVEN
   }

РЕДАКТИРОВАТЬ (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
    }
5 голосов
/ 08 апреля 2013

используя условие внутри цикла:

$class = 'odd';  
for(.........) # no problem what kind of loop you are using(for,foreach,while,do)
{
   $class = ($class == 'even' ? 'odd' : 'even');
   #some code 
}
2 голосов
/ 11 сентября 2009

Если вы когда-либо удаляете статью, у вас могут возникнуть проблемы - ваш код предполагает, что ID работает (нечетный, четный, нечетный, четный) и т. Д.

Лучше было бы создать отдельный объект-итератор, чтобы на каждом шаге выдавать вам необходимые значения. Вот что я использую:

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();
}
0 голосов
/ 03 сентября 2014

Получить 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];
        }
    }
0 голосов
/ 10 сентября 2009

Вы уверены, что $ findpost-> ID содержит порядковые номера?

Вы можете заменить if / else на короткое трехзначное выражение, например:

$side = empty($side) || $side == 'right' ? 'left' : 'right';
$serp_list_li[] = '<div class="serial-contain-' . $side . '">' // ...the rest

Сначала будет добавлена ​​«левая» сторона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...