#ARRAY

A tag #ARRAY pode conter uma matriz PHP, ou seja, um conjunto de pares chave/valor, que queremos armazenar para usá-los em seguida no template.

A matriz pode ser declarada pela tag #SET e pode, em seguida, ser recuperada pela tag #GET [1].

Pode ser usada em seguida, entre outros, associada ao critério IN de um loop.

Declarar uma matriz e recuperar valores

-  #SET{minha_matriz, #ARRAY{chave1,valor1,chave2,valor2}}
cria a variável minha_matriz e atribui a matriz PHP como valor, podendo ser representada com abaixo:

ChavesValores
chave1 valor1
chave2 valor2

Não é necessário envolver as strings em aspas simples ou duplas, excepto para especificar uma string vazia, que se notará ’’

-  Para fins de teste, pode-se exibir a matriz com o filtro |foreach (obsoleto após SPIP 4)

-  O valor associado a uma determinada chave pode ser recuperada usando-se o filtro |table_valeur :

[(#GET{minha_matriz}|table_valeur{chave1})] devolve valor1.

Após o SPIP 3.0, pode-se simplificar na seguinte forma [(#GET{minha_matriz/chave1})].

-  Verificar a presença de um valor na matriz com o filtro |find [2]:

[(#GET{minha_matriz}|find{valor2}|oui)
  Será exibido se o valor existir na matriz.
]

Preencher uma matriz dinamicamente

Uma vantagem das matrizes é que podem ser preenchida dinamicamente pelos resultados de um ou mais loops.

A matriz deve ser declarada por um #SET antes do loop : #SET{minha_matriz,#ARRAY}

No loop, um novo #SET redefine a minha_matriz a cada iteração: ele é recuperado por #GET e incluí-se um novo valor graças aos filtros |push ou |array_merge.

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

A ordem dos valores da matriz depende dos critérios de ordenação do loop.

-  |push inclui simplesmente um valor ao final da matriz. A chave é indexada automaticamente: ela é incrementada em 1 a cada iteração do loop, iniciando em 0 (a primeira chave é 0, em seguida 1, 2, 3,...).

Exemplo: criar uma matriz palavras_escolhidas contendo os #ID_MOT de todas as palavras-chave ligadas a uma matéria.

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

Se as palavras ligadas a esta matéria tiverem os números 4, 9 e 18, [(#GET{palavras_escolhidas}|foreach)] devolve:

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

Note que [(#GET{palavras_escolhidas}|table_valeur{2})] devolve 18, o valor associado à chave 2, ou seja, o terceiro valor da matriz.

-  |array_merge inclui um par chave/valor ao fim da matriz. Isto permite forçar o "nome" das chaves.

Atenção (1) : se uma chave aparece várias vezes, apenas o último valor para essa chave será retido.

Atenção (2) : a chave que se quer forçar não pode ser do tipo numérico. Com efeito, a documentação de array_merge especifica:

Se você passar uma única matriz a esta função e ele tiver índices numéricos, as chaves serão reindexadas normalmente.

Existem duas soluções para esta limitação:

-  prefixar esta chave com um valor alfanumérico:

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

[(#GET{palavras_escolhidas}|foreach)] devolve:

  • mot4=>Maçã
  • mot9=>Banana
  • mot18=>Cenoura

-  inverter chave e valor, na condição de valor não seja ele mesmo numérico:

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

[(#GET{palavras_escolhidas}|foreach)] devolve:

  • Maçã=>4
  • Banana=>9
  • Cenoura=>18

Neste caso, pode-se aplicar a função PHP |array_flip como filtro na matriz final (após o loop):

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

[(#GET{palavras_escolhidas}|foreach)] devolve então:

  • 4=>Maçã
  • 9=>Banana
  • 18=>Cenoura

Em certos caso, pode-se usar a tag #LISTE que permite inserir matrizes de forma simplificada.

Usar a matriz num loop com o operador IN

Retomemos a matriz palavras_escolhidas contendo os #ID_MOT, pode-se selecionar em seguida as matérias ligadas às mesmas palavras-chave que a nossa matéria inicial, graças ao critério IN.

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

<BOUCLE_mesmos_temas(ARTICLES) {id_mot IN #GET{palavras_escolhidas}}>
  #TITRE <br>
</BOUCLE_mesmos_temas>

Esta utilização conhece múltiplos usos, particularmente quando queremos selecionar objetos com a ajuda de vários critérios que não podem fazer parte do mesmo loop, e depois combiná-los entre si com um critério de ordenação único.

Exemplos de utilização de matrizes

-  Exibição condicional em função da página (valor de #ENV{page}) :

[(#ENV{page}|in_array{#ARRAY{0,article,1,rubrique,2,site}}|oui)
Exibição condicional: a página é de uma matéria, de uma seção ou de um site. ]

-  Exibição condicional em função de uma variável passada no URL [3] :

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

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

[<br>Isto será exibido se o valor da variável 'lolo' passada no URL estiver presente numa matriz 'as_palavras' declarado e preenchido previamente.
  (#ENV{lolo}|in_any{#GET{as_palavras}}|oui)]

-  Selecionar as matérias de uma seção e suas associadas, relativamente a uma palavra-chave, e listar todas essas matérias por data.

#SET{as_materias,#ARRAY}
<BOUCLE_materias_secao(ARTICLES){id_rubrique}>
  #SET{as_materias,#GET{as_materias}|push{#ID_ARTICLE}}
</BOUCLE_materias_secao>
<BOUCLE_materias_palavra(ARTICLES){id_mot}>
  #SET{as_materias,#GET{as_materias}|push{#ID_ARTICLE}}
</BOUCLE_materias_palavra>

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

Fazer loop sobre qualquer matriz

Pode-se usar o loop DATA para percorrer arbitrariamente uma matriz.

Testar se uma matriz está vazia

1º caso
Se #GET{minha_matriz} for uma matriz vazia

/* eu declaro uma matriz vazia */
[(#SET{minha_matriz, #ARRAY})]

/* então o teste a seguir é suficiente: */
[(#GET{minha_matriz}|non) … ]

2º caso
No caso de entradas vazias na matriz, tal como:

[(#SET{minha_matriz, #ARRAY{0,'',1,0}})]

… pode-se usar a função PHP array_filter() que removerá da matriz qualquer valor equivalente a false.

[(#GET{minha_matriz}|array_filter|non) ... ]

Ver também

  • #LISTE: tag prática para declarar matrizes simples indexadas
  • O loop DATA: para usar matrizes complexas

Notas

[1Ver #SET e #GET para mais detalhes.

[2|find corresponde à função PHP in_array, com a diferença de que este filtronão produz a mensagem de erro "Warning : in_array() [function.in-array] : Wrong datatype for second argument." se a variável não for realmente uma matriz. Com efeito, quando uma variável é gerada dinamicamente, nunca se sabe se ela existirá e se se trata realmente de uma matriz.

[3Ver #SELF e |parametre_url.

Autor Ricardo Porto Publié le : Mis à jour : 10/03/25

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