8791 sujets

Développement web côté serveur, CMS

Bonjour à tous !


Je voudrais savoir comment faire pour prendre une valeur dans un array, avec un foreach, mais qui est au milieu de cet array, puis ensuite de reprendre l'array dans l'ordre en sautant la valeur affichée au début... Vous comprenez ?

Par exemple avec mon foreach j'affiche les mois de l'année, donc j'ai les mois dans l'ordre de Janvier à Décembre.

Ce que je voudrais c'est d'afficher en premier, non pas janvier, mais le mois actuel, puis après, afficher le calendrier dans l'ordre, mais sans afficher une deuxième fois le mois actuel.

Mon foreach :

foreach ($dates as $afficher_mois => $jour_du_mois)
{
}

$dates est l'array contenant tout le calendrier.
$afficher_mois contient le mois.
$jour_du_mois est l'array contenant les jours de ce mois.


Merci à vous !
Modifié par Crousti2 (29 Dec 2011 - 19:10)
Salut,

D'abord, tu affiches le mois actuel, en cherchant directement l'indice dans le tableau ($dates['décembre'], par exemple). Ensuite, tu exécutes ta boucle foreach, à l'intérieur de laquelle tu appliques l'instruction continue si $afficher_mois correspond au mois actuel.
Salut,

Merci à toi !

Mais pour vérifier que j'ai affiché le moi actuel je fais quoi ?

J'aurais tendance à créer une variable qui vaut zéro, et lorsque j'affiche le mois je change la valeur de cette variable et je met 1, puis une condition si la variable est égale à 1 j'affiche pas le mois actuel... Y a t-il plus logique ? plus simple ? plus rapide ?

$affichage_moi_actuel = 0

foreach (...)
{
if ($affichage_moi_actuel != 1)
{
on affiche le mois actuel
$affichage_moi_actuel = 1
}
...
}
Salut,

Si tu ne veux pas de prendre la tête utilise les iterateur: ArrayIterator, AppendIterator, LimitIterator.

Et en quelque lignes ça donne:

$date_iterator = new ArrayIterator($dates);
$it = new AppendIterator;
$it->append(new LimitIterator($date_iterator, $numero_du_mois_actuel)); //0->janvier, 1->fevrier, etc
$it->append(new LimitIterator($date_iterator, 0, $numero_du_mois_actuel));
foreach ($it as $afficher_mois => $jour_du_mois)
 {
 }
Bon, je reformule ma réponse sous forme de code.
$mois_actuel = 'décembre';
// Ici, on affiche le mois actuel
echo $dates[$mois_actuel]; // par exemple

foreach ($dates as $afficher_mois => $jour_du_mois)
{
  // On zappe le mois actuel
  if ($afficher_mois == $mois_actuel) continue;
  else
  {
    // Instructions permettant d'afficher les mois restants
  }
}

À adapter à ton code, bien entendu.

Est-ce plus clair ?
Ah ok tu sépare le mois actuel du reste du calendrier.... je croyais que tu voulais tout faire dans la même boucle ! C'est vrai que c'est mieux comme ça !! ^^


jo_link_noir merci, je vais lire et relire et rerelire ton code pour le comprendre, j'ai du mal avec la poo... les foreach ça va mieux, les array ça va un peu mieux aussi Smiley lol


Merci à vous !


Voilà à quoi ça ressemble Smiley lol :


http://img24.imageshack.us/img24/1040/calendrier2n.jpg
Modifié par Crousti2 (30 Dec 2011 - 13:32)
@Victor BRITO: Le comportement me paré étrange quand par exemple mois_actuel=février. De tête ça donne Février, Janvier, Mars, Avril … ou c'est moi qui est raté un truc Smiley sweatdrop ?


Crousti2 a écrit :
jo_link_noir merci, je vais lire et relire et rerelire ton code pour le comprendre, j'ai du mal avec la poo... les foreach ça va mieux, les array ça va un peu mieux aussi Smiley lol


Les itérateurs de php sont puissants et utilisable à toute les sauces (avec modération tout de même Smiley cligne ).
Pour expliquer un peu leur fonctionnement, tout les itérateurs sont basé sur 5 fonctions : rewind, valid, next, current et key. Un foreach utilise de manière transparente les 5 fonctions:
foreach($it as $k => $v){}

équivaut à
$it->rewind();
while ($it->valid()){
$k=$it->key();
$v=$it->current();
//...
$it->next();
}

Le principe est le même pour un array sauf que les fonctions utilisées sont reset, next et key. next fait aussi current et key permet de vérifier si le pointeur interne du tableau est valide (quand le tableau est entièrement parcourut key retourne false).
Chaque itérateurs à ça propre méthode de parcours et on peux tout aussi bien créé le sien.

ArrayIterator: équivalant à array sauf que c'est un Itérateur. Le passage par référence s'applique toujours car c'est un objet (mais c'est le propre de la poo).
AppendIterator: Une collection d'itérateurs. On parcours l'itérateur 1, puis le 2, etc. Revient à faire une double boucle. Mon exemple aurait pu ressembler à quelque chose comme "foreach(array($it1,$it2) as $it){foreach ($it as $afficher_mois => $jour_du_mois){}}" avec it1 et it2 étant les limiteiterartor.
LimitIterator: Démarre d'un indice jusqu'à une limit. Ça fait n boucle dans le vide pour ce positionner puis retourne les valeurs jusqu'à ce que la limite soit atteinte.
En gros, les itérateurs donne une règle de parcours, ce qui permet de lire les valeurs sans modifier les données de base.
La spl fournit bon nombre de classes implémentant des itérateurs (à 1 exceptions près: SplFileInfo). Et cela simplifie souvent les choses.