Conversión de matriz Twig a cadena

3 minutos de lectura

Avatar de usuario de Chris98
cris98

Esto es probablemente relativamente fácil de hacer, pero soy nuevo en Twig y estoy frustrado.

Estoy adaptando el código de esta respuesta: https://stackoverflow.com/a/24058447

la matriz está hecha en PHP a través de este formato:

$link[] = array(
       'link' => 'http://example.org',
       'title' => 'Link Title',
       'display' => 'Text to display',
);

Luego, a través de twig, le agrego html, antes de implosionar:

    <ul class="conr">
        <li><span>{{ lang_common['Topic searches'] }} 
        {% set info = [] %}
        {% for status in status_info %}
            {% set info = info|merge(['<a href="https://stackoverflow.com/questions/32633853/{{ status[\"link\'] }}" title="https://stackoverflow.com/questions/32633853/{{ status[\"title\'] }}">{{ status[\'display\'] }}</a>']) %}
        {% endfor %}

        {{ [info]|join(' | ') }}
    </ul>

Pero estoy recibiendo:

error [8] Conversión de matriz a cadena en F:\localhost\www\twig\include\lib\Twig\Extension\Core.php en la línea 832

Se soluciona cuando elimino esta línea, pero no se muestra:

{{ [info]|join(' | ') }}

¿Alguna idea de cómo puedo implosionar esto correctamente?

** actualizar **

Usando la función de volcado de Twig no devuelve nada. Parece que ni siquiera lo está cargando en la matriz en primer lugar. ¿Cómo puedo cargar información en una nueva matriz?

  • si estás leyendo esto en 2023, join admite dos parámetros: glue, and (“and: El separador para el último par de elementos de entrada […] El and El argumento se agregó en Twig 1.37.“)

    – Sandra

    18 de enero a las 11:35

info es una matriz, por lo que debe escribir simplemente

{{ info|join(', ') }}

para mostrar su matriz de información.

[info] es una matriz con un valor: la información de la matriz.

  • NB: solo se trabaja con valores en el caso de una matriz asociativa

    – Delfina

    17 de noviembre de 2017 a las 15:39

  • @Delphine Si desea unir las claves de una matriz asociativa, puede pasar la matriz a través del keys filtrar primero, es decir {{ info | keys | join(', ') }}

    – Dan Abrey

    14 de diciembre de 2017 a las 11:31


Realmente no debería estar construyendo estructuras de datos complejas dentro de las plantillas de Twig. Puede lograr el resultado deseado de una manera más idiomática y legible como esta:

{% for status in status_info %}
    <a href="https://stackoverflow.com/questions/32633853/{{ status.link }}" title="{{ status.title }}">{{ status.display }}</a>
    {% if not loop.last %}|{% endif %}
{% endfor %}

  • El problema es, sin embargo, implosionarlo. Necesito cada elemento separado por un ‘ | ‘ pero cuando hago esto manualmente, hay un “|” extra en el lado derecho de la página. Esa es la única forma que se me ocurre para obtener solo la cantidad necesaria.

    – Chris98

    17/09/2015 a las 15:40


  • Uhm… eso es lo que if not loop.last se supone que previene…!?

    – deceze

    17/09/2015 a las 15:41

  • De acuerdo. Gracias. Nunca había oído hablar de eso. Soy bastante nuevo en Twig.

    – Chris98

    17/09/2015 a las 15:41


Avatar de usuario del desarrollador
Desarrollador

Puede usar json_encode para serializar la matriz como cadena, luego mostrar bastante – construir en ramita

    {{ array|json_encode(constant('JSON_PRETTY_PRINT')) }} 
    

  • Explique eso más: ¿qué hace su código? Tenga en cuenta que otros deberían poder aprender de ese código.

    –Nico Haase

    28 de junio de 2019 a las 14:48

  • Esta es la mejor respuesta, porque convertirá toda la estructura en una cadena, mientras que join fallará si la variable es una matriz anidada (por ejemplo, intente ['a', ['b'] ]). Útil para la depuración.

    – Fabien Snauwaert

    2 de abril de 2020 a las 8:52

Avatar de usuario de Georg
Jorge

si necesita una matriz asociativa:

{{info|json_encode(constant('JSON_PRETTY_PRINT'))|raw}}

¿Ha sido útil esta solución?