controle d'une boucle foreach

manusoo
Invité n'ayant pas de compte PHPfrance

11 nov. 2009, 12:38

Bonjour,

Sachant qu'une boucle foreach lit tous les eléments d'un tableau est-il possible d'éviter l'affichage du premier
élément de ce tableau pour les 2 boucles foreach, ici le premier élément de $category et $attributes ?

Dans un premier temps, j'ai assayé array_slice mais j'obtiens un warning
Warning: array_slice() expects parameter 1 to be array,

foreach (array_slice($attributes, 1) as $attribute) {
...
foreach (array_slice($values, 1) as $value) {

Code : Tout sélectionner

$category = $document->categories->category; $attributes = $category->attributes->attribute; foreach ($attributes as $attribute) { echo "<div id=total_matches_container><div id=total_matches><div id=total_num_of_matches>{$attribute->name}\n</div>"; $values = $attribute->attributeValues->attributeValue; foreach ($values as $value) { printf("<span class='result_list'><a href=?attributeValue=%s&categories=".$_GET['categories']."&k=".$_GET['k']."> %-16s</a></span><br /> \n", $value["id"], $value->name); } echo "</div></div>"; } echo "</div>";
Auriez-vous un autre idée qui permette cela ,

merci manuso

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 nov. 2009, 16:08

Bonjour,

Voici une idée:
$i=0;
foreach ($attributes as $attribute) { 
     if (++$i==1) continue; // Si on est sur le 1er élément, on passe son tour

     // ici ton traitement PHP...
}
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 369 Messages

11 nov. 2009, 16:49

Salut,
Bonjour,
Sachant qu'une boucle foreach lit tous les eléments d'un tableau est-il possible d'éviter l'affichage du premier
élément de ce tableau pour les 2 boucles foreach, ici le premier élément de $category et $attributes ?
Dans un premier temps, j'ai assayé array_slice mais j'obtiens un warning
Warning: array_slice() expects parameter 1 to be array,
foreach (array_slice($attributes, 1) as $attribute) {
[...]
T'as aussi cette solution:
<?php
  $arrayOrig = Array("a", "b", "c", "d");
  $array = $arrayOrig;

  array_shift($array);

  foreach ($array AS $value)
  {
     echo $value;
  }
?>
A toi de voir celle qui te convient. Attention tout de même. Cette proposition t'oblige,
dans un premier temps à sauvegarder le tableau original si tu souhaites, par la suite,
retouver l'element "0" donc niveau temps: aucune idée ;)

@+ bon code ;)

EDIT: Je comprends pas pourquoi ton array_slice marche pas. Tel qu'il est écrit il est correct.
En tout cas ca devrait marcher et serait le mieux à faire.

manusoo
Invité n'ayant pas de compte PHPfrance

11 nov. 2009, 19:20

Bonjour,

Voici une idée:
$i=0;
foreach ($attributes as $attribute) { 
     if (++$i==1) continue; // Si on est sur le 1er élément, on passe son tour ;-)

     // ici ton traitement PHP...
}
Merci, le premier est pas mal entre temps j'ai aussi celui-ci dessous, mais pouvez vous me dire si le code ci-dessous
se tient. En fait ce code sous cette forme a pour but de vérifier la presence d'un attribut
dans un fichier xml, <attribute id="category"> comme cet attribut est en premier, s'il existe je démarre a 1) sinon
a 2). mais pour autant s'il n'existe pas ( } else { )on ne démarre pas au premier élément comme prévu.

merci pour le premier code

Code : Tout sélectionner

$document = new SimpleXMLElement($urle, NULL, TRUE); $category = $document->categories->category; $attributes = $category->attributes->attribute; $tag="category"; if($tag==$attributes->tagAttrs['id']){ $i = 0; echo "<div><div>"; // foreach ($attributes as $attribute) { if($i) { echo "<div id=total_matches_container><div id=total_matches><div id=total_num_of_matches>{$attribute->name}\n</div>"; $values = $attribute->attributeValues->attributeValue; foreach ($values as $value){ printf("<span class='result_list'><a href=?attributevalue=%s&categories=".$_GET['categories']."&k=".$_GET['k']."> %-16s</a></span><br /> \n", $value["id"], $value->name); } } $i++; echo "</div></div>"; } } else { foreach ($attributes as $attribute) { echo "<div id=total_matches_container><div id=total_matches><div id=total_num_of_matches>{$attribute->name}\n</div>"; $values = $attribute->attributeValues->attributeValue; foreach ($values as $value) { printf("<span class='result_list'><a href=http://biz.surfandbiz.com/shopi?k=".$_GET['k']."&attributevalue=%s&categories=".$_GET['categories']."> %-16s</a></span><br /> \n", $value["id"], $value->name); } echo "</div></div>"; } }