De vraag is simpel. Ik heb een foreach
lus in mijn code:
foreach($array as $element) {
//code
}
In deze lus wil ik anders reageren als we in de eerste of laatste iteratie zitten.
Hoe kan ik dit doen?
Je zou het eerste en het laatste element uit de array kunnen halen en ze apart verwerken.
Zoiets als dit:
<?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
?>
Het verwijderen van alle opmaak naar CSS in plaats van inline tags zou je code verbeteren en de laadtijd versnellen.
Je zou ook kunnen vermijden HTML te mengen met php logica waar mogelijk.
Je pagina zou een stuk leesbaarder en onderhoudbaarder gemaakt kunnen worden door dit soort dingen te scheiden:
<?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: Waarom gebruik je niet een simpel for
statement? Ervan uitgaande dat je'een echte array gebruikt en niet een Iterator
zou je eenvoudig kunnen controleren of de tellervariabele 0 is of één minder dan het hele aantal elementen. Naar mijn mening is dit de meest schone en begrijpelijke oplossing...
$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: Je zou moeten overwegen om Nested Sets te gebruiken om je boomstructuur op te slaan. Daarnaast kun je het geheel verbeteren door recursieve functies te gebruiken.