Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Incrément dans une boucle for

2 views
Skip to first unread message

Didier

unread,
Aug 11, 2022, 9:42:55 AM8/11/22
to
Bonjour,
Est-il possible d'incrémenter la variable d'une boucle for autrement que
de 1 ?
Je voudrais un truc du genre :
$intervalle=20;
for($i=0;$i<100;$i+intervalle)
Je me heurte à une erreur :
Allowed memory size of 134217728 bytes exhausted (tried to allocate
100663304 bytes)
(je ne sais pas si c'est directement lié à mon incrément).
Sur Internet, on ne voit que des exemples de type $i++, même si la
syntaxe qui semble officielle est for (expr1,expr2,expr3), expr3 étant
une expression évaluée.
Merci.
Didier.

Olivier Miakinen

unread,
Aug 11, 2022, 11:02:54 AM8/11/22
to
Le 11/08/2022 à 15:42, Didier a écrit :
> Bonjour,
> Est-il possible d'incrémenter la variable d'une boucle for autrement que
> de 1 ?

Oui.

> Je voudrais un truc du genre :
> $intervalle=20;
> for($i=0;$i<100;$i+intervalle)

for($i=0;$i<100;$i+=intervalle)

Soit dit en passant, je préfère pour ma part du code plus aéré :

for ($i = 0; $i < 100; $i += intervalle)

> Je me heurte à une erreur :
> Allowed memory size of 134217728 bytes exhausted (tried to allocate
> 100663304 bytes)

C'est normal si tu fais des allocations dans ta boucle.

Avec $i = 0 qui n'est jamais incrémenté, la valeur de ($i + intervalle)
est égale à intervalle à chaque tour de boucle, cela fait donc une
boucle infinie.

> (je ne sais pas si c'est directement lié à mon incrément).

Donc non. Tu ne fais aucun incrément, et le problème d'allocation doit
avoir lieu quelque part dans la boucle.

> Sur Internet, on ne voit que des exemples de type $i++

En effet, il est dommage que sur cette page ils ne parlent pas de la
possibilité d'incrémenter ou décrémenter d'une valeur autre que 1 :
https://www.php.net/manual/fr/language.operators.increment.php

C'est dans les opérateurs d'affectation que l'on voit la syntaxe
$a += $b :
https://www.php.net/manual/fr/language.operators.assignment.php

Note que c'est une syntaxe raccourcie, et que l'affectation normale
conviendrait tout aussi bien, à savoir :
$a = $a + 1 au lieu de $a++
$a = $a - 1 au lieu de $a--
$a = $a + 2 au lieu de $a += 2
et ainsi de suite.


Pour en revenir à ton exemple, tu pouvais donc écrire :

for ($i = 0; $i < 100; $i = $i + intervalle)


--
Olivier Miakinen

Didier

unread,
Aug 11, 2022, 1:03:21 PM8/11/22
to
Le 11/08/2022 à 17:02, Olivier Miakinen a écrit :
> Le 11/08/2022 à 15:42, Didier a écrit :
>
>> Je voudrais un truc du genre :
>> $intervalle=20;
>> for($i=0;$i<100;$i+intervalle)
>
> for($i=0;$i<100;$i+=intervalle)
>
Oups oui, j'ai dû faire une erreur en recopiant mon code, ou alors mon
problème était là. Depuis d'ai simplifié mon code, et j'ai pu me ramener
à une boucle où j'incrémente en faisant $i++.
Mais je viens d'essayer ta proposition, ça fonctionne.
> Soit dit en passant, je préfère pour ma part du code plus aéré :
>
> for ($i = 0; $i < 100; $i += intervalle)
>
>> Je me heurte à une erreur :
>> Allowed memory size of 134217728 bytes exhausted (tried to allocate
>> 100663304 bytes)
>
> C'est normal si tu fais des allocations dans ta boucle.
Oui je fais une allocation d'une valeur dépendant de $i dans un tableau.
Mais rien sur la variable de boucle elle-même.
>
> Avec $i = 0 qui n'est jamais incrémenté, la valeur de ($i + intervalle)
> est égale à intervalle à chaque tour de boucle, cela fait donc une
> boucle infinie.
>
Je devais être dans cette situation, mais comme mon code finissait pas
ne pas être trop clair, j'ai tout repris à zéro, et comme d'hab le plus
simple s'est montré le plus efficace et a le mieux marché.

En tout cas merci pour ton aide rapide, ça ouvre toujours les yeux sur
le truc plus gros que nous et qu'on ne voit pas au beau milieu de notre
code.
Et je suis rassuré de savoir qu'on peut incrémenter d'un pas supérieur à
1, voir un pas évalué.

Didier.

0 new messages