Wie bestimmt man die erste und letzte Iteration in einer foreach-Schleife?

Die Frage ist einfach. Ich habe eine "Foreach"-Schleife in meinem Code:

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

In dieser Schleife möchte ich unterschiedlich reagieren, wenn wir uns in der ersten oder letzten Iteration befinden.

Wie kann ich das tun?

Lösung

Sie könnten einen Zähler verwenden:

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

Sie könnten das erste und das letzte Element aus dem Array entfernen und separat verarbeiten.
Zum Beispiel so:

<?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
?>

Wenn Sie die gesamte Formatierung in CSS statt in Inline-Tags umwandeln, würde das Ihren Code verbessern und die Ladezeit beschleunigen.

Sie könnten auch vermeiden, HTML mit php-Logik zu mischen, wann immer dies möglich ist.
Ihre Seite könnte viel lesbarer und wartbarer werden, wenn Sie solche Dinge trennen:

<?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
}
?>
Kommentare (0)

1: Warum nicht eine einfache "for"-Anweisung verwenden? Wenn man davon ausgeht, dass man ein echtes Array und keinen "Iterator" verwendet, könnte man einfach prüfen, ob die Zählervariable 0 oder ein Element weniger als die gesamte Anzahl der Elemente ist. Meiner Meinung nach ist das die sauberste und verständlichste Lösung...

$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: Du solltest die Verwendung von Nested Sets in Betracht ziehen, um deine Baumstruktur zu speichern. Zusätzlich können Sie das Ganze durch rekursive Funktionen verbessern.

Kommentare (1)