php: Dizideki tek / çift döngü eklemek için nasıl

5 Cevap

Aşağıdaki yorum nedeniyle, burada pastebin üzerinde kodu: http://pastebin.com/m6b0bb378

Herkes burada ben bir ocder değilim gibi, ben tam olarak gerekenleri yapmak için almak istiyorsa tam komut, bu yüzden ben burada kaybettim alıyorum: http://pastebin.com/m6e8a5f5d

Scragar sayesinde, ben yukarıdaki sahneye var. Sorun "garip" bölümü sadece tüm diğerleri hatta kullanıyorsanız, ilk yineleme için yukarı gösteriyor, bu yüzden yanlış bir şey olduğunu.

Birisi bana düzeltmenize yardımcı olabilir umuduyla bu yüzden tek / çift düzgün çalışır.

5 Cevap

Üç yolu vardır

Modülo

for ($i = 0; $i < 10; $i++)
{
  if ($i % 2 == 0)
  {
    echo "even";
  }
  else
  {
    echo "odd";
  }
}

Boolean değer Lanetleme

$even = true;
for ($i = 0; $i < 10; $i++)
{
  if ($even)
  {
    echo "even";
  }
  else
  {
    echo "odd";
  }

  $even = !$even;
}

Ve boolean operatörü söz

for ($i = 0; $i < 10; $i++)
{
  if ($i & 1 == 0)
  {
    echo "even";
  }
  else
  {
    echo "odd";
  }
}

En hızlı Boole operatörüdür. Eğer (ID numaraları ile çalışan ve bazı eksik gibi) çok farklı numaralar varsa Ama en sağlam yöntem saygısız.

Ben kod üzerinde bakmadım, ama bu döngü sayısını saymak için bir değişken kullanarak eğer bunu yapabilirsiniz:

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

EDIT(1): I looked at the section you are running into, and now I have another problem, I'm unsure how you are judging what should be odd or not, so I propose two answers:

1: tek döngü itteration:

   /* 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: Tek kimlik numarası:

 } elseif ( ( $findpost->ID ) != $id ) {
    if($findpost->ID & 1){
       // ODD
    }else{
       //EVEN
    }

döngüsü içindeki durumu kullanarak:

$Class = 'odd';  
for(.........) # no problem what kind of loop you are using(for,foreach,while,do)
{
   echo $Class = ($Class == 'even'?'odd':'even');
   #some code 
}

Hiç sorun olabilir bir makale silerseniz - kodunuz varsayar kimlik çalışır (tek, çift, tek, hatta vb)

Daha iyi bir fikir, her aşamada size gerekli değerleri beslemek için ayrı bir yineleyici bir nesne oluşturmak olacaktır. İşte ne kullanın:

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

sonra çıkışı kolaylaştırır

$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();
}

Eğer $ findpost-> ID ardışık sayılar içerir emin misiniz?

Böyle s kısa üçlü deyimi ile if / else yerini alabilir:

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

Bu öncelikle bir 'sol' tarafı eklersiniz.