Bir foreach döngüsünde ilk ve son yineleme nasıl belirlenir?

Soru basit. Kodumda bir foreach döngüsü var:

foreach($array as $element) {
    //code
}

Bu döngüde, ilk veya son iterasyonda olduğumuzda farklı tepki vermek istiyorum.

Bu nasıl yapılır?

Çözüm

Bir sayaç kullanabilirsin:

$i = 0;
$len = count($array);
foreach ($array as $item) {
    if ($i == 0) {
        // first
    } else if ($i == $len - 1) {
        // last
    }
    // …
    $i++;
}
Yorumlar (11)

İlk ve son elemanları diziden çıkarabilir ve bunları ayrı ayrı işleyebilirsiniz.
Bunun gibi:

<?php
$array = something();
$first = array_shift($array);
$last = array_pop($array);

// do something with $first
foreach ($array as $item) {
 // do something with $item
}
// do something with $last
?>

Tüm biçimlendirmeyi satır içi etiketler yerine CSS'ye kaldırmak kodunuzu iyileştirecek ve yükleme süresini hızlandıracaktır.

Mümkün olduğunca HTML ile php mantığını karıştırmaktan da kaçınabilirsiniz.
Sayfanızı bu şekilde ayırarak çok daha okunabilir ve sürdürülebilir hale getirebilirsiniz:

<?php
function create_menu($params) {
  //retirive menu items 
  //get collection 
  $collection = get('xxcollection') ;
  foreach($collection as $c) show_collection($c);
}

function show_subcat($val) {
  ?>
    <div class="sub_node" style="display:none">

      <a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links"  >
        <?php echo $val['xsubcatname']; ?>
      </a>
    </div>
  <?php
}

function show_cat($item) {
  ?>
    <div class="node" >


      <?php echo $item['xcatname']; ?>
      <?php 
        $subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ;
        foreach($subcat as $val) show_subcat($val);
      ?>
    </div>
  <?php
}

function show_collection($c) {
  ?>
    <div class="parent" style="direction:rtl">


      <?php echo $c['xcollectionname']; ?>
      <?php
        //get categories 
        $cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
        foreach($cat as $item) show_cat($item);
      ?>
    </div>
  <?php
}
?>
Yorumlar (0)

1: Neden basit bir for deyimi kullanmıyorsunuz? Bir Iterator değil de gerçek bir dizi kullandığınızı varsayarsak, sayaç değişkeninin 0 mı yoksa tam eleman sayısından bir eksik mi olduğunu kolayca kontrol edebilirsiniz. Bence bu en temiz ve anlaşılabilir çözümdür...

$array = array( ... );

$count = count( $array );

for ( $i = 0; $i < $count; $i++ )
{

    $current = $array[ $i ];

    if ( $i == 0 )
    {

        // process first element

    }

    if ( $i == $count - 1 )
    {

        // process last element

    }

}

2: Ağaç yapınızı saklamak için Nested Sets kullanmayı düşünmelisiniz. Ek olarak, özyinelemeli işlevler kullanarak her şeyi geliştirebilirsiniz.

Yorumlar (1)