首页 > 解决方案 > 树枝合并错误值“[”的意外标记“标点符号”

问题描述

我的目标是有一个像“名称:冰沙,成分:牛奶,橙子,类别:素食主义者”这样的字符串(可以有很多选项:值或选项:值,值,值......对)来生成一个像下列的

[
  {
     option: 'name',
     value: ['smoothie']
  },
  {
     option: 'ingredients',
     value: ['milk', 'orange']
  },
  {
     option: 'category',
     value: ['vegan']
  }
]

我认为像下面这样的东西会起作用,但它会产生以下错误,我不明白为什么。问题出在我尝试向现有 options[last_ok_index].value 数组添加值的行中

{% set options[last_ok_index].value = options[last_ok_index].value|merge( [ x[0] ] ) %}

值“[”的意外标记“标点符号”(应为“语句块结束”)。

{% set product = "name: smoothie, ingredients: milk, orange" %}
{% set options = [] %}
{% set last_ok_index = 0 %}
{% for item in product|split(',') %}
    {% set x = item|split(': ') %}
    {% if x|length == 2 %}
        {% set options = options|merge( [ { option: x[0], value: [x[1]] } ] ) %}
        {% set last_ok_index = loop.index - 1 %}
    {% else %}
        {% set options[last_ok_index].value = options[last_ok_index].value|merge( [ x[0] ] ) %}
    {% endif%}
{% endfor %}

{# print result #}
{% for item in options %}
    {{item.option }}
    {% for inner_item in item.value %}
        {{"-" ~ inner_item}}
    {% endfor %}
{% endfor %}

标签: phpsymfonymergetwig

解决方案


您应该接受@dbrumann 评论中的建议并使用TwigExtension.
但是,如果您想在 pure 中解决这个问题twig,那么您的事情就过于复杂了。

首先,问题已经从您的第一个开始split,您的预期输出是smoothieand ingredients,而实际结果将是smoothie, ingredients, orange。您可以通过将第二个参数传递给split过滤器来解决此问题,这将限制输出。

Split在后台使用该PHP功能explode。有关第二个参数的更多信息,您可以在此处的文档中找到

现在正如我所说,您可以通过在两部分而不是一个部分中创建“项目”来简单地创建您的片段

{% set product = "name: smoothie, ingredients: milk, orange" %}

{% set items = [] %}

{% for item in product|split(',', 2) %}
    {% set tmp = item|split(':') %}
        
    {% set option = tmp[0] %}
    {% set values = [] %}
        
    {% for value in tmp[1]|split(',') %}
       {% set values = values|merge([ value, ]) %}
    {% endfor %}    
    
    {% set items = items|merge([ {'option': option, 'values': values,}, ]) %}
{% endfor %}

演示


当您更改了原始问题的初始输入时。问题仍然始于split过滤器。我建议您使用另一个分隔符作为您的值,例如;

{% set product = 'name: smoothie 3, ingredients: milk ; orange; pineapple, category: bar' %}
{% set products = [] %}

{% for string in products_raw %}
    {% set product = [] %}
       
    {% for item in string|split(',') %}
        {% set tmp = item|split(':') %}
        
        {% set option = tmp[0] %}
        {% set values = [] %}
        
        {% for value in tmp[1]|split(';') %}
            {% set values = values|merge([ value, ]) %}
        {% endfor %}    
    
        {% set product = product|merge([ {'option': option, 'values': values,}, ]) %}
    {% endfor %}
    
    {% set products = products|merge([ product, ]) %}
{% endfor %}

{% for product in products %}
    {% for item in product %}
    - Option: {{ item.option }}
    - Values:
    {% for value in item.values %}
        - {{value }}
    {% endfor %}
{% endfor %}    
----------------------------------
{% endfor %}

演示


推荐阅读