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:
Chaves | Valores |
---|---|
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