Utiliser des variables comme clés dans un tableau Twig

Share Button

Read the English version

Il y a quelques temps, j’ai rencontré un “problème” en utilisant des variables numériques comme clés dans un tableau Twig.
C’est un problème très spécifique qui est dû à l’utilisation de fonction php array_merge. La documentation spécifie que “les clés numériques des tableaux d’entrées seront renumérotées”. Mon but n’est donc pas d’expliquer les raisons de ce comportement, mais plutôt de proposer une solution.

Le tableau Twig d’origine

{% set array =
    {
        0:{'numeric':20,'text':'vingt'},
        1:{'numeric':40,'text':'quarante'},
        2:{'numeric':10,'text':'dix'},
        3:{'numeric':30,'text':'trente'}
    }
 %}

{% set loopValues =  [10,20,30,40] %}

Imaginons que nous travaillons avec le tableau associatif ci-dessus. Les clés ne sont pas pertinentes, le tableau n’est pas classé et nous ne pouvons pas le classer en utilisant ses clés. Les valeurs à utiliser pour classer le tableau se situent dans le tableau lui même (les clés “numéric”).
Nous devons donc construire un autre tableau temporaire.
Dans mon cas, le tableau original était retourné par des facettes Elasticsearch, et je devais boucler sur un autre tableau (valeurs récupérées en base de données) pour afficher les facettes dans le bon ordre (regardez le code ci-dessous pour mieux comprendre).

Construire un tableau intermédiaire

{# définit un tableau vide #}
{% set tempArray = {} %}

{# et le remplit avec "numeric" comme clé et "text" comme valeur #}
{% for item in array %}
    numeric : {{ item.numeric }}, text : {{ item.text }} <br/ >
    {% set tempArray = tempArray|merge({(item.numeric):(item.text)}) %}
{% endfor %}

{# affiche le tableau temporaire, juste pour l'exemple et pour vous montrer ce qui cloche #}
{% for key,val in tempArray %}
    {{ key }} : {{ val }} <br/ >
{% endfor %}

{# lance une exception car les clés 10,20,30,40 n'existent pas #}
{% for val in loopArray %}
    {{ tempArray[val] }} <br/ >
{% endfor %}

Note: Notez les parenthèses utilisées dans la méthode merge. Elles sont obligatoires pour éviter une erreur de syntaxe Twig.

Le résultat obtenu n’est pas celui escompté :

numeric : 20, text : vingt
numeric : 40, text : quarante
numeric : 10, text : dix
numeric : 30, text : trente

0 : vingt
1 : quarante
2 : dix
3 : trente

Comme vous le voyez, les clés “numeric” n’ont pas été remplies comme prévu dans le tableau temporaire. En réalité elles l’ont été, puis ont été réécrites par php. C’est un comportement très étrange…

La solution

La solution que j’ai trouvé n’est peut être pas la plus propre mais elle fonctionne. Comme les variables de clé numériques ne fonctionnent pas, nous allons utiliser des string. Voyez le code mis à jour ci-dessous, et l’underscore que j’ai ajouté.

{# nous ajoutond un underscore dans la clé #}
{% for item in array %}
    numeric : {{ item.numeric }}, text : {{ item.text }}
    {% set tempArray = tempArray|merge({('_'~item.numeric):(item.text)}) %}
{% endfor %}

{% for val in loopArray %}
    {{ tempArray['_'~val] }} <br/ >
{% endfor %}

Maintenant le résultat est bien celui attendu :

dix
vingt
trente
quarante

Share Button

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Protected by WP Anti Spam