php - 树枝合并错误值“[”的意外标记“标点符号”
问题描述
我的目标是有一个像“名称:冰沙,成分:牛奶,橙子,类别:素食主义者”这样的字符串(可以有很多选项:值或选项:值,值,值......对)来生成一个像下列的
[
{
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 %}
解决方案
您应该接受@dbrumann 评论中的建议并使用TwigExtension
.
但是,如果您想在 pure 中解决这个问题twig
,那么您的事情就过于复杂了。
首先,问题已经从您的第一个开始split
,您的预期输出是smoothie
and 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 %}
推荐阅读
- python - Line2D服装图例只有一点
- uiscrollview - 使用带有 iOS 13 可拉动模式的无限滚动 UICollectionView
- node.js - 为什么使用 n 安装 nodejs ubuntu 时缺少目录?
- mysql - Mysql:比较一张表中两列的值
- php - Laravel Imap connect() 慢 | 重用?
- jquery - 使用 jquery 在开始时重置时间计数器
- javascript - Nuxt.js:全局 mixin 仅在服务器端工作
- reporting-services - 列超链接并将数据从主报告传递到其他报告
- arduino - 在与 HC-05 的 Arduino 连接中,串行通信无法正常工作
- java - 从 webapplicationexception 返回 JSON 正文中的错误