SPIP

[ar] [ast] [bg] [br] [ca] [co] [cpf] [cs] [da] [de] [en] [eo] [es] [eu] [fa] [fon] [fr] [gl] [id] [it] [ja] [lb] [nl] [oc] [pl] [pt] [ro] [ru] [sk] [sv] [tr] [uk] [vi] [zh] Espace de traduction

Download

#ARRAY

12 maart — aangepast op : 20 juni

Alle versies van dit artikel:

Het baken #ARRAY kan een PHP tabel bevatten, een geheel van paren van sleutelwaardes (keys) en waardes (values), dat kan worden opgeslagen om elders in een skelet te worden toegepast.

De tabel wordt gedeclareerd met het baken #SET en kan vervolgens worden uitgelezen met het baken #GET [1].

Het kan onder andere worden gebruikt met de voorwaarde IN van een lus.


Een tabel declareren en zijn waardes uitlezen

-  #SET{mijn_tabel, #ARRAY{key1,waarde1,key2,waarde2}}
definieert de variabele mijn_tabel als een PHP tabel die als volgt kan worden weergegeven:

Keyswaardes
key1 waarde1
key2 waarde2

De karakterreeksen hoeven niet van enkele of dubbele aanhalingstekens te worden voorzien, tenzij het om een lege reeks gaat, geschreven als ’’.

-  Als test kun je de tabel weergeven met het filter |foreach.

[(#GET{mijn_tabel}|foreach)] geeft:

  • key1=> waarde1
  • key2=> waarde2

-  De waarde die aan een gegeven sleutel toebehoort kan worden opgevraagd met het filter |table_valeur :

[(#GET{mijn_tabel}|table_valeur{key1})] geeft waarde1.

-  Je test de aanwezigheid van een waarde in de tabel met het filter |find [2]:

  1. [(#GET{mijn_tabel}|find{waarde2}|oui)
  2.   Toon dit als de waarde in de tabel voorkomt.
  3. ]

Een tabel dynamisch vullen

Een interessante toepassing van een tabel is hem dynamisch te vullen met resultaten uit één of meerdere lussen.

De tabel wordt gedeclareeerd met #SET vóór de lus: #SET{mijn_tabel,#ARRAY}

In de lus zal een nieuwe #SET bij iedere iteratie mijn_tabel herdefiniëren: je leest hem uit met #GET en voegt een nieuwe waarde toe door middel van de filters |push of |array_merge.

  1. #SET{mijn_tabel,#ARRAY}
  2. <BOUCLE(...)>
  3.     #SET{mijn_tabel, #GET{mijn_tabel}|push{#COMPTEUR_BOUCLE}}
  4. </BOUCLE>

De volgorde van de waardes in de tabel hangt af van de sorteervolgorde van de lus.

-  |push voegt simpelweg een waarde toe aan het eind van de tabel. De key wordt automatisch geïndexeerd: bij iedere iteratie wordt ze met 1 verhoogd, te beginnen met 0 (de eerste key is 0, vervolgens 1, 2, 3,...).

Voorbeeld: we maken een tabel gekozen_trefw met de #ID_MOT van alle trefwoorden die aan een artikel zijn gekoppeld.

  1. #SET{gekozen_trefw, #ARRAY}
  2. <BOUCLE_thema(MOTS){id_article}>
  3.   #SET{gekozen_trefw, #GET{gekozen_trefw}|push{#ID_MOT}}
  4. </BOUCLE_thema>

Wanneer de aan dit artikel gekoppelde trefwoorden de identificatiecodes 4, 9 en 18 hebben, zal [(#GET{gekozen_trefw}|foreach)] retourneren:

  • 0=>4
  • 1=>9
  • 2=>18

Denk er dus aan dat [(#GET{gekozen_trefw}|table_valeur{2})] als resultaat 18 geeft, de waarde die bij key 2 behoort, dus de derde waarde van de tabel.

-  |array_merge voegt een combinatie key/waarde aan het eind van de tabel toe. Hiermee kun je dus de "naam" van de key bepalen.

Let op :als een key meerdere malen voorkomt, zal alleen de laatste waarde voor deze key worden geretourneerd. Ook mag de geforceerde key niet numeriek zijn. In de documentatie van array_merge kunnen we lezen dat in dat geval alle keys normaal zullen worden geherindexeerd.

Er zijn voor deze beperking twee oplossingen:

-  de key een prefix geven in letters:

  1. #SET{gekozen_trefw, #ARRAY}
  2. <BOUCLE_thema(MOTS) {id_article}>
  3.   [(#SET{gekozen_trefw,#GET{gekozen_trefw}|array_merge{#ARRAY{wrd#ID_MOT,#TITRE}}})]
  4. </BOUCLE_themes>

[(#GET{gekozen_trefw}|foreach)] geeft:

  • wrd4=>Appel
  • wrd9=>Banaan
  • wrd18=>Wortel

-  key en waarde omkeren, op voorwaarde dat waarde niet ook numeriek is:

  1. #SET{gekozen_trefw, #ARRAY}
  2. <BOUCLE_thema(MOTS) {id_article}>
  3.   [(#SET{gekozen_trefw,#GET{gekozen_trefw}|array_merge{#ARRAY{#TITRE,#ID_MOT}}})]
  4. </BOUCLE_thema>

[(#GET{gekozen_trefw}|foreach)] geeft:

  • Appel=>4
  • Banaan=>9
  • Wortel=>18

In dit geval krijg je met de PHP functie |array_flip als filter op de uiteindelijke tabel (dus na de lus):

[(#SET{gekozen_trefw, #GET{gekozen_trefw}|array_flip})]

[(#GET{gekozen_trefw}|foreach)] geeft dan:

  • 4=>Appel
  • 9=>Banaan
  • 18=>Wortel

De tabel gebruiken in een lus met IN

We nemen de tabel gekozen_trefw met de #ID_MOT en kunnen vervolgens de artikelen selecteren die dezelfde trefwoorden hebben als het eerste artikel dankzij de voorwaarde IN.

  1. #SET{gekozen_trefw, #ARRAY}
  2. <BOUCLE_thema(MOTS){id_article}>
  3.   #SET{gekozen_trefw, #GET{gekozen_trefw}|push{#ID_MOT}}
  4. </BOUCLE_thema>
  5.  
  6. <BOUCLE_zelfde_thema(ARTICLES) {id_mot IN #GET{gekozen_trefw}}>
  7.   #TITRE <br />
  8. </BOUCLE_zelfde_thema>

Zo kun je vele toepassingen bedenken, met name wanneer je objecten wilt selecteren aan de hand van meerdere voorwaardes die niet allemaal onderdeel uitmaken van dezelfde lus en die vervolgens onderling mengen met een unieke sortering.

Voorbeelden van het gebruik van tabellen

-  Conditionele weergave in functie van de pagina (waarde van #ENV{page}) :

  1. [(#ENV{page}|in_array{#ARRAY{0,article,1,rubrique,2,site}}|oui)
  2. Codnitionele weergave: de pagina is van een artikel, rubriek of site. ]

-  Conditionele weergave in functie van een in de URL doorgegeven variabele [3]:

  1. <BOUCLE_alle_trefw(MOTS){par titre}{", "}>
  2.   <a href="[(#SELF|parametre_url{xyz,#ID_MOT})]">#TITRE</a>
  3. </BOUCLE_alle_trefw>
  4.  
  5. #SET{de_trefw, #ARRAY}
  6. <BOUCLE_bepaalde_trefw(MOTS){id_article}>
  7.   #SET{de_trefw, #GET{de_trefw}|push{#ID_MOT}}
  8. </BOUCLE_bepaalde_trefw>
  9.  
  10. [<br />dit wordt weergegeven wanneer de waarde van variabele 'xyz' die in de URL werd doorgegeven, aanwezig is in tabel 'de_trefw' die eerder werd gedeclareerd en gevuld.
  11.   (#ENV{lxyz}|in_any{#GET{de_trefw}}|oui)]

-  Kies de artikelen van een rubriek en die welke aan een trefwoord zijn gekoppeld en geeft ze vervolgens op datumvolgorde weer.

  1. #SET{de_artikelen,#ARRAY}
  2. <BOUCLE_art_rub(ARTICLES){id_rubrique}>
  3.   #SET{de_artikelen,#GET{de_artikelen}|push{#ID_ARTICLE}}
  4. </BOUCLE_art_rub>
  5. <BOUCLE_art_mot(ARTICLES){id_mot}>
  6.   #SET{de_artikelen,#GET{de_artikelen}|push{#ID_ARTICLE}}
  7. </BOUCLE_art_mot>
  8.  
  9. <BOUCLE_weergave(ARTICLES){id_article IN #GET{de_artikelen}}{par date}>
  10.   <br />#TITRE
  11. </BOUCLE_weergave>

Lussen op iedere mogelijke tabel

Je kunt de lus DATA gebruiken om lussen te maken met een tabel.

Opmerkingen

[1Zie #SET en #GET voor meer details.

[2|find correspondeert met de PHP functie in_array, maar met dat verschil dat het filter geen foutboodschap genereert "Warning : in_array() [function.in-array]: Wrong datatype for second argument." wanneer de variabele geen tabel blijkt te zijn. Omdat een variabele dynamisch wordt gegenereerd, weet je niet altijd of het om een tabel gaat.

[3Zie #SELF en |parametre_url.


Het skelet van deze bladzijde zien Site gebouwd met SPIP | Vertaalruimte | Privé-site