Doorlopende array in loop

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nien E

Nien E

06/06/2018 10:41:33
Quote Anchor link
Hi!

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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)
PHP script in nieuw venster Selecteer het PHP script
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
<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>


Hopelijk heb ik het een beetje goed uitgelegd. Heeft iemand een idee?
Gewijzigd op 06/06/2018 11:07:20 door Nien E
 
PHP hulp

PHP hulp

14/07/2020 08:24:26
 
Thomas van den Heuvel

Thomas van den Heuvel

06/06/2018 13:27:36
Quote Anchor link
Die valueloop is dus een soort van layouttechnisch ding die verder niets te maken heeft met de $attachment_ids?

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>

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
 
Nien E

Nien E

06/06/2018 13:59:59
Quote Anchor link
Hi Thomas,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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>


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
 
Thomas van den Heuvel

Thomas van den Heuvel

06/06/2018 14:03:21
Quote Anchor link
Yes, de declaratie van dat array en het geven van de initiële waarde van de teller die meeloopt ($index) -regel 3 en 4- dienen buiten de foreach-loop te staan -regel 5-, zoals in mijn bovenstaande fragment te zien is.

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
 
Nien E

Nien E

06/06/2018 20:17:34
Quote Anchor link
Nou het is gelukt hoor! Ontzettend bedankt!

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 :-)
 
Thomas van den Heuvel

Thomas van den Heuvel

06/06/2018 20:39:57
Quote Anchor link
Je zou de functie de (berekende) $index kunnen voeren, en dan het resultaat kunnen laten retourneren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
function valueloop($index) {
    $values = array(4,8,6,6,8,4);
    return $values[$index];
}

?>

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.
 
Kees buijs

kees buijs

07/06/2018 01:09:25
Quote Anchor link
je kunt beter die $index via de modulo funktie laten lopen, dan voorkom je dat met een foute $index een foutmelding (of onverwachte waarde krijgt.

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) ];
 
Nien E

Nien E

08/06/2018 10:10:03
Quote Anchor link
Ik las inderdaad al ergens dat het gebruik van een globale variabele niet altijd even handig is. Ik ga eens kijken wat een configuratie object is. Het is inderdaad WordPress dat ik gebruik :-)

Dank voor het meedenken allebei!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.