#ARRAY

L’etiqueta #ARRAY pot contenir una matriu PHP, és a dir, un conjunt de parelles clau/valor, que volem emmagatzemar per tornar-les a utilitzar en el conjunt de l’esquelet.

La matriu ha d’estar declarada per l’etiqueta #SET i pot, a continuació, ser recuperada per l’etiqueta #GET [1].

Pot ser utilitzada a continuació, entre altres coses, associada al criteri IN d’un bucle.

Declarar una matriu i recuperar-ne els valors

-  #SET{mon_tableau, #ARRAY{cle1,valeur1,cle2,valeur2}}
crea la variable mon_tableau i li assigna una matriu PHP com a valor, que es podria representar d’aquesta manera:

ClausValors
cle1 valeur1
cle2 valeur2

No és necessari envoltar les cadenes de caràcters amb cometes simples o dobles, excepte quan vulguem especificar una cadena buida que escriurem ’’

-  Amb finalitats de proves, podem visualitzar la matriu gràcies al filtre |foreach.

[(#GET{mon_tableau}|foreach)] mostrarà:

  • cle1=> valeur1
  • cle2=> valeur2

-  El valor associat a una clau determinada es pot recuperar utilitzant el filtre |table_valeur:

[(#GET{mon_tableau}|table_valeur{cle1})] retorna valeur1.

-  Verificar la presència d’un valor a la matriu amb el filtre |find [2]:

[(#GET{mon_tableau}|find{valeur2}|oui)
  Ceci s'affiche si la valeur est dans le tableau.
]

Omplir una matriu dinàmicament

Un interès de les taules és la d’omplir-les dinàmicament, pels resultats d’un o diversos bucle(s).

Llavors, la matriu s’ha de declarar per un #SET abans del bucle: #SET{mon_tableau,#ARRAY}

En el bucle, un nou #SET redefineix mon_tableau a cada iteració: el recuperem per #GET i s’hi afegeix un nou valor gràcies als filtres |push o |array_merge.

#SET{mon_tableau,#ARRAY}
<BOUCLE(...)>
    #SET{mon_tableau, #GET{mon_tableau}|push{#COMPTEUR_BOUCLE}}
</BOUCLE>

L’ordre dels valors de la matriu dependrà dels criteris d’ordre del bucle.

-  |push afegeix simplement un valor al final de la matriu. La clau s’indexa automàticament: s’incrementa d’1 a cada repetició del bucle i i aquest, a partir de 0 (la primera clau és 0, després 1, 2, 3,...).

Exemple: crear una matriu mots_choisis que continguin les #ID_MOT de totes les paraules clau lligades a un article.

#SET{mots_choisis, #ARRAY}
<BOUCLE_themes(MOTS){id_article}>
  #SET{mots_choisis, #GET{mots_choisis}|push{#ID_MOT}}
</BOUCLE_themes>

Si les paraules lligades a aquest article tenen els números 4, 9 i 18, [(#GET{mots_choisis}|foreach)] retourne :

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

Fixeu-vos bé que [(#GET{mots_choisis}|table_valeur{2})] retorna 18, el valor associat a la clau 2, per tant el tercer valor de la matriu.

-  |array_merge afegeix un parell clau/valor al final de la matriu. Això permet, per tant, forçar el "nom" de les claus.

Alerta (1): si una clau apareix diverses vegades, només es retindrà l’últim valor d’aquesta clau.

Alerta (2): la clau que es vol forçar no pot ser de tipus numèric. En efecte, la documentació d’array_merge precisa:

Si passeu una sola matriu a aquesta funció i hi ha índexs numèrics, les claus seran tornades a indexar normalment.

Hi ha dues solucions a aquesta limitació:

-  prefixar aquesta clau amb un valor alfabètic:

#SET{mots_choisis, #ARRAY}
<BOUCLE_themes(MOTS) {id_article}>
  [(#SET{mots_choisis,
      #GET{mots_choisis}|array_merge{#ARRAY{
          mot#ID_MOT, #TITRE
      }}
  })]
</BOUCLE_themes>

[(#GET{mots_choisis}|foreach)] retorna:

  • mot4=>Poma
  • mot9=>Plàtan
  • mot18=>Pastanaga

-  invertir clau i valor, amb la condició que valor no sigui numèric:

#SET{mots_choisis, #ARRAY}
<BOUCLE_themes(MOTS) {id_article}>
  [(#SET{mots_choisis,
      #GET{mots_choisis}|array_merge{#ARRAY{
          #TITRE, #ID_MOT
      }}
  })]
</BOUCLE_themes>

[(#GET{mots_choisis}|foreach)] retorna:

  • Poma=>4
  • Plàtan=>9
  • Pastanaga=>18

En aquest cas, podrem aplica la funció PHP |array_flip com a filtre a aquesta matriu final (desprès del bucle):

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

[(#GET{mots_choisis}|foreach)] retorna llavors:

  • 4=>Poma
  • 9=>Plàtan
  • 18=>Pastanaga

Utilitzar la matriu a dins d’un bucle amb l’operador IN

Tornem a agafar la matriu mots_choisis que conté #ID_MOT, a continuació es pot seleccionar els articles lligats a les mateixes paraules clau que el nostre article inicial gràcies al criteri IN.

#SET{mots_choisis, #ARRAY}
<BOUCLE_themes(MOTS){id_article}>
  #SET{mots_choisis, #GET{mots_choisis}|push{#ID_MOT}}
</BOUCLE_themes>

<BOUCLE_memes_themes(ARTICLES) {id_mot IN #GET{mots_choisis}}>
  #TITRE <br />
</BOUCLE_memes_themes>

Aquest ús té múltiples usos, sobretot quan es vol seleccionar objectes amb l’ajuda de diversos criteris que no poden formar part del mateix bucle, per barrejar-los després entre ells amb un criteri de selecció únic.

Exemples d’ús de les taules

-  Visualització condicional en funció de la pàgina (valor de #ENV{page}) :

[(#ENV{page}|in_array{#ARRAY{0,article,1,secció,2,lloc}}|si)
Visualització condicional: la pàgina és la d'un article, d'una secció o d'un lloc. ]

-  Visualització condicional en funció d’una variable passada a l’URL [3] :

<BOUCLE_tous_les_mots(MOTS){par titre}{", "}>
  <a href="[(#SELF|parametre_url{lolo,#ID_MOT})]">#TITRE</a>
</BOUCLE_tous_les_mots>

#SET{les_mots, #ARRAY}
<BOUCLE_certains_mots(MOTS){id_article}>
  #SET{les_mots, #GET{les_mots}|push{#ID_MOT}}
</BOUCLE_certains_mots>

[<br />Això mostrarà si el valor de la variable 'lolo' passada a l'url és a la matriu 'les_mots' declarada i omplerta anteriorment.
  (#ENV{lolo}|in_any{#GET{les_mots}}|si)]

-  Seleccionar els articles d’una secció i tots aquells que es puguin trobar arreu associats a una paraula clau i després llistar tots aquests articles per data.

#SET{les_articles,#ARRAY}
<BOUCLE_articles_rubrique(ARTICLES){id_rubrique}>
  #SET{les_articles,#GET{les_articles}|push{#ID_ARTICLE}}
</BOUCLE_articles_rubrique>
<BOUCLE_articles_mot(ARTICLES){id_mot}>
  #SET{les_articles,#GET{les_articles}|push{#ID_ARTICLE}}
</BOUCLE_articles_mot>

<BOUCLE_affiche(ARTICLES){id_article IN #GET{les_articles}}{par date}>
  <br />#TITRE
</BOUCLE_affiche>

Notes

[1Si voleu més detalls, vegeu #SET i #GET.

[2|find correspon a la funció PHP in_array, amb la diferència que aquest filtre no dóna el missatge d’error "Warning : in_array() [function.in-array]: Wrong datatype for second argument." si la variable n’est finalement pas un tableau. Efectivament, quan una variable està generada automàticament, no es pot saber sempre si existirà i si es tractarà d’una matriu.

[3Vegeu #SELF i |parametre_url.

Autor merce Publié le : Mis à jour : 26/10/12

Traductions : عربي, català, English, Español, français, Nederlands