Doorlopende array in loop
Ik ben echt nog een beginner, hopelijk kunnen jullie mij helpen met het volgende.
Wat ik heb:
Een functie genaamd valueloop() daarin een array (4,8,6,6,8,4)
Het volgende stukje code wordt telkens herhaald in mijn loop (deze bevat dus nog een loop):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<div <?php wc_product_class('grid-x grid-margin-x'); ?>>
<?
$attachment_ids = $product->get_gallery_attachment_ids();
foreach( $attachment_ids as $attachment_id )
{
$image_link = wp_get_attachment_url( $attachment_id );
?>
<div class="medium-<? valueloop();?> small-12 cell productitem" style="background: url(<? echo $image_link; ?>) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<? } ?>
</div>
<?
$attachment_ids = $product->get_gallery_attachment_ids();
foreach( $attachment_ids as $attachment_id )
{
$image_link = wp_get_attachment_url( $attachment_id );
?>
<div class="medium-<? valueloop();?> small-12 cell productitem" style="background: url(<? echo $image_link; ?>) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<? } ?>
</div>
Probleem:
Doordat de functie 'valueloop' zich in de attachment-loop bevindt, wordt de output van 'valueloop' herhaalt. Ik krijg dus twee keer dezelfde waarde als de attachment-loop twee items bevatten.
Wat ik wil:
Ik wil dat de output van 'valueloop' door blijft lopen zodat ik telkens een andere medium-class krijg.
Zoals in het volgende voorbeeldje:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<div class="grid-x grid-margin-x">
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-6 small-12 cell productitem" style="background: url(afbeelding3.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-6 small-12 cell productitem" style="background: url(afbeelding4.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding5.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding6.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-6 small-12 cell productitem" style="background: url(afbeelding3.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-6 small-12 cell productitem" style="background: url(afbeelding4.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding5.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding6.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
Hopelijk heb ik het een beetje goed uitgelegd. Heeft iemand een idee?
Gewijzigd op 06/06/2018 11:07:20 door Nien E
Dus als die 8 items zou hebben dan zou wat nu "valueloop()" is een iteratie van die foreach-lus achtereenvolgens de volgende waarde moeten hebben: 4, 8, 6, 6, 8, 4, 4, 8? Dus als je aan het einde bent van het valueloop-array zou je weer opnieuw moeten beginnen met het doorlopen ervan?
Dit is eenvoudig te doen met "modulo-rekenen". Dit wil zeggen "de rest na deling door". Het symbool in PHP daarvoor is %. Wat je dus doet is een tellertje mee laten lopen in de foreach-lus en de index van het "valueloop"-array gelijk stellen aan de teller modulo de lengte van dit array. Als de teller dan positie 7 bereikt (index 6 want we tellen vanaf 0), dan wordt weer de eerste positie gepakt (index 0). Immers de rest na deling van 6 (huidige index) door 6 (lengte van het array) is 0.
Code wordt dan zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<div <?php wc_product_class('grid-x grid-margin-x'); ?>><?php
$attachment_ids = $product->get_gallery_attachment_ids();
$valueloop = [4,8,6,6,8,4];
$index = 0;
foreach( $attachment_ids as $attachment_id )
{
$image_link = wp_get_attachment_url( $attachment_id );
?><div class="medium-<?php echo $valueloop[$index]; ?> small-12 cell productitem" style="background: url(<?php echo $image_link; ?>) center center/cover no-repeat;">
<!-- hier komt de content -->
</div><?php
$index = ($index + 1) % count($valueloop);
}
?></div>
$attachment_ids = $product->get_gallery_attachment_ids();
$valueloop = [4,8,6,6,8,4];
$index = 0;
foreach( $attachment_ids as $attachment_id )
{
$image_link = wp_get_attachment_url( $attachment_id );
?><div class="medium-<?php echo $valueloop[$index]; ?> small-12 cell productitem" style="background: url(<?php echo $image_link; ?>) center center/cover no-repeat;">
<!-- hier komt de content -->
</div><?php
$index = ($index + 1) % count($valueloop);
}
?></div>
En mogelijk is het beter om een meer omschrijvende naam voor $valueloop te verzinnen uiteraard. $mediumClasses ofzo.
Gewijzigd op 06/06/2018 13:27:51 door Thomas van den Heuvel
Ontzettend bedankt voor je uitgebreide reactie, volgens mij heb je m'n vorige berichtje goed begrepen :-)
Ik had nog nooit gehoord van modulo-rekenen. Heel fijn dat je me uitleg hebt gegeven.
Ik heb de loop bijna werkend. De output is nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<div class="grid-x grid-margin-x">
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
<div class="grid-x grid-margin-x">
<div class="medium-4 small-12 cell productitem" style="background: url(afbeelding1.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
<div class="medium-8 small-12 cell productitem" style="background: url(afbeelding2.png) center center/cover no-repeat;">
<!-- hier komt de content -->
</div>
</div>
Hierboven is te zien dat er vanaf begin af aan geteld wordt ipv dat er door wordt geteld. Ik heb zo'n vermoeden dat ik de $valueloop (ik heb de naam nu aangepast naar MediumClass), buiten de eerste loop moet plaatsen; hier ben ik volgens mij niet helemaal duidelijk over geweest. Ik ga nog even rustig naar je code kijken en wat meer informatie zoeken over modulo-rekenen. En dan denk ik dat ik er uit ga komen :-)
Heel erg bedankt, je hebt me in ieder geval verder geholpen!
Groet,
Nienes
Succes :]
EDIT: als je later meer van dat soort loopjes hebt, zou je dus vantevoren $index weer in kunnen stellen op 0 om weer vanaf het begin te gaan lo(o)pen.
Gewijzigd op 06/06/2018 14:06:17 door Thomas van den Heuvel
Het enige waar ik nog wel tegenaan liep is dat ik een functie had gemaakt (valueloop()) met een global variabele omdat de tweede loop (attachment) in een ander bestand stond (via een include).
Ik heb hier voor het gemak één bestand van gemaakt. Maar mocht het heel gemakkelijk op te lossen zijn dan ben ik best nieuwsgierig hoe :-)
Code (php)
Maar dat komt in wezen op hetzelfde neer, met als enig verschil dat $values op één plaats verankerd is. Maar daarvoor zou je misschien ook (en wellicht beter) een (globaal toegankelijk) configuratie-object kunnen gebruiken als er zoiets bestaat in WordPress (dat is geloof ik het pakket wat je gebruikt?). Of maakt hier een globale (overal toegankelijke) variabele van met behulp van define() maar daar zou ik spaarzaam gebruik van maken.
En het lijkt me dat je beter een for loop als foreach loop kunt gebruiken in de aanroepende routine. Dat voorkomt dat je vroegtijdig aan het einde van de loop komt (foreach loopt voor elk van de beschikbare waardes enb stopt daarna).
Je kunt dan ook makelijk bij een waarde ongelijk aan 0 beginnen.
dus de volgende regel wordt dan als volgt:
return $values[$index % count($values) ];
Dank voor het meedenken allebei!