145 votes

Fixer l'élément d'un tableau à partir de Twig

Comment puis-je définir le membre d'un tableau déjà existant à partir de Twig ?

J'ai essayé de le faire de la manière suivante :

{% set arr['element'] = 'value' %}

mais j'ai obtenu l'erreur suivante :

Unxpected token "punctuation" of value "[" ("end of statement block") attendu) dans ...

2voto

n8tron Points 49
{% set links = {} %}

{# Use our array to wrap up our links. #}
{% for item in items %}
  {% set links = links|merge({ (loop.index0) : {'url': item.content['#url'].getUri(), 'text': item.content['#title']} }) %}
{% endfor %}

{%
set linkList = {
  'title': label,
  'links': links
}
%}

{% include '<to twig file>/link-list.twig'%}

Merci pour ce fil de discussion -- j'ai également pu créer un tableau avec (loop.index0) et l'envoyer à twig.

2voto

savedario Points 396

J'ai trouvé ce problème très ennuyeux, et ma solution est peut-être orthodoxe et non conforme à la philosophie de Twig, mais j'ai développé ce qui suit :

$function = new Twig_Function('set_element', function ($data, $key, $value) {
    // Assign value to $data[$key]
    if (!is_array($data)) {
        return $data;
    }
    $data[$key] = $value;
    return $data;
});
$twig->addFunction($function);

qui peut être utilisé comme suit :

{% set arr = set_element(arr, 'element', 'value') %}

2voto

couchwood Points 393

J'ajoute ma réponse au cas où quelqu'un aurait besoin de mettre à jour le tableau lorsque merge ne fonctionne pas car elle se contente d'ajouter à la fin d'un tableau au lieu de permettre de modifier une valeur existante.

Disons que vous avez un tableau words_array comme ci-dessous :

Object {
 0: "First word"
 1: "Second word"
 2: "Third word"
}

Afin de mettre à jour "Second word" vous pouvez faire ce qui suit :

{% set words_array = {(1): 'New word'} + words_array %}

Le tableau résultant serait :

Object {
 0: "First word"
 1: "New word"
 2: "Third word"
}

Vous pouvez aller encore plus loin si vous utilisez une boucle et utiliser la fonction loop.index0 variable quelque chose comme ce qui suit :

{% for word in words_array %}
  {% if word == 'Second word' %}
    {% set words_array = {(loop.index0): 'New word'} + words_array %}
  {% endif %}
{% endfor %}

2voto

user1321109 Points 51

Il suffit d'utiliser ceci comme {% set arr={'key':'value'} %} (sans espace blanc après le : ), cela fonctionne bien.

Mais lorsque je l'utilise à l'intérieur d'une boucle for, pour en faire un tableau, il ne fonctionne pas en dehors de la portée for.

{% for group in user.groups %}
  {% set foo={'loop.index0':'group.id'} %}
  {% set title={'loop.index0':'group.title'} %}
  {{ title }} //it work 
{% else %}
  {% set foo={'0':'-1'} %}
  {% set title={'0':''} %}
{% endfor %}
{{ title }}  //it does not work, saying title is not defined

1 votes

Si vous voulez utiliser la variable en dehors de la boucle for, vous devez la définir en dehors de la boucle for, voir ici : twig.sensiolabs.org/doc/tags/set.html

5 votes

C'est tout à fait faux. L'espace après les deux points n'a pas d'importance. Vous créez de nouveaux tableaux, et non pas un élément dans le tableau, ce qui était la question. Vous ne pouvez pas sortir un tableau comme {{ tableau }}, cela générerait une erreur. Cette réponse est pleine d'erreurs et n'a aucun rapport avec la question posée.

3 votes

Je ne comprends pas pourquoi cela a des upvotes, comme indiqué ci-dessus, presque tout est incorrect dans cette "réponse" ...

1voto

shobekhan Points 91

J'avais un tableau à plusieurs dimensions. La seule solution que j'ai trouvée consiste à créer un nouveau tableau temporaire et à mettre à jour/additionner l'information, qui était ensuite transmise à une autre fonction du rameau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X