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?
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++;
}
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">
<img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" />
<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" >
<img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" />
<img src="../images/dtree/folder.gif" align="absmiddle" id="folder">
<?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">
<img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" />
<img src="../images/dtree/base.gif" align="absmiddle" id="base">
<?php echo $c['xcollectionname']; ?>
<?php
//get categories
$cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
foreach($cat as $item) show_cat($item);
?>
</div>
<?php
}
?>
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.