如何在Twig模板中基于title合并两个对象数组?
问题根源与解决方法
Twig自带的merge过滤器是基于数组键名实现合并的,它只会处理数组的数字索引或字符串键的重复覆盖/追加,完全不会识别对象里的title字段并以此为关联条件——这就是你直接用merge要么关联不上、要么丢数据的原因。
下面是按title字段合并两个数组的可行方案:
1. 先构建价格数组的标题索引
先把var_arr转换成以title为键、price为值的关联数组,这样后续可以快速通过标题匹配价格:
{% set price_map = {} %} {% for item in var_arr %} {% set price_map = price_map|merge({ (item.title): item.price }) %} {% endfor %}
2. 遍历opt_arr生成合并数组
遍历opt_arr的每一项,匹配price_map里对应的价格,组装成包含title、id、price的新对象:
{% set merged_array = [] %} {% for opt in opt_arr %} {% set merged_item = { title: opt.title, id: opt.id, price: price_map[opt.title] ?? null {# 处理标题不存在时的空值 #} } %} {% set merged_array = merged_array|merge([merged_item]) %} {% endfor %}
3. 可选:补充opt_arr中没有的标题项
如果需要保留var_arr里存在但opt_arr中没有的标题项,可以再加一段遍历补充:
{% for item in var_arr %} {% set is_exists = false %} {% for opt in opt_arr %} {% if opt.title == item.title %} {% set is_exists = true %} {% break %} {% endif %} {% endfor %} {% if not is_exists %} {% set merged_item = { title: item.title, id: null, price: item.price } %} {% set merged_array = merged_array|merge([merged_item]) %} {% endif %} {% endfor %}
内容的提问来源于stack exchange,提问作者Meules
相关产品推荐
相关产品推荐

