La question est simple. J'ai une boucle foreach
dans mon code :
foreach($array as $element) {
//code
}
Dans cette boucle, je veux réagir différemment lorsque nous sommes dans la première ou la dernière itération.
Comment faire ?
Vous pourriez retirer le premier et le dernier élément du tableau et les traiter séparément.
Comme ceci :
<?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
?>
La suppression de tout le formatage en CSS au lieu des balises en ligne améliorerait votre code et accélérerait le temps de chargement.
Vous pourriez également éviter de mélanger HTML et logique php dans la mesure du possible.
Votre page pourrait être rendue beaucoup plus lisible et maintenable en séparant les choses comme ceci :
<?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 : Pourquoi ne pas utiliser une simple instruction for
? En supposant que vous utilisez un vrai tableau et non un Iterator
, vous pourriez facilement vérifier si la variable compteur est égale à 0 ou inférieure d'une unité au nombre total d'éléments. A mon avis, c'est la solution la plus propre et la plus compréhensible...
$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 : Vous devriez envisager d'utiliser [Nested Sets][1] pour stocker votre structure arborescente. De plus, vous pouvez améliorer l'ensemble en utilisant des fonctions récursives.
[1] : http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/