Smarty foreach 结果分组和连接

Smarty foreach result grouped and concatenate

我有一个多维数组,想生成一个定义列表,该列表按名称分组,值以逗号分隔。

通过 smarty foreach 循环,我设法生成了一个定义列表,但无法按名称分组,也无法连接各个值。

数组如下所示:

Array ( 
    [0] => Array ( 
        [name] => Fabric 
        [value] => Silk 
    ) 
    [1] => Array ( 
        [name] => Paper 
        [value] => A4 
    ) 
    [2] => Array ( 
        [name] => Paper 
        [value] => A5 
    ) 
)

聪明的 foreach 循环:

<dl>
    {foreach from=$products item=feature}
        <dt>{$feature.name}</dt>
        <dd>{$feature.value}</dd>
    {/foreach}
</dl>

到目前为止,我刚刚设法得到一个这样的定义列表:

<dl>
    <dt>Fabric</dt>
    <dd>Silk</dd>
    <dt>Paper</dt>
    <dd>A4</dd>
    <dt>Paper</dt>
    <dd>A5</dd>
</dl>

这就是我需要的方式:

<dl>
    <dt>Fabric</dt>
    <dd>Silk</dd>
    <dt>Paper</dt>
    <dd>A4, A5</dd>
</dl>

如有任何帮助,我们将不胜感激。

我忘了说我不能更改数组。我必须在 .tpl 文件中解决这个问题。

// Setup:
$products = 
[
    ['name' => 'Fabric', 'value' => 'Silk'],
    ['name' => 'Paper', 'value' => 'A4'],
    ['name' => 'Paper', 'value' => 'A5'],
];

首先让我们按名称和功能对您的产品进行分组:

function groupByKeys($array) 
{
    $result = [];
    
    foreach($array as $key => $value) {
        if(!array_key_exists($value['name'], $result)) {
            $result[$value['name']] = [];
        }
        
        $result[$value['name']][] = $value['value'];
    }
    
    return $result;
}


$groupedproducts = groupByKeys($products);

然后在模板中显示它们,值以逗号分隔:

<dl>
    {foreach from=$groupedproducts key=k item=v}
        <dt>{$k}</dt>
        <dd>{', '|implode:$v}</dd>
    {/foreach}
</dl>

要在模板级别执行此操作,您可以使用以下语法创建一个数组以按名称对产品进行分组:

{foreach from=$products item=feature}
    {$grouped[$feature.name][] = $feature.value}
{/foreach}

然后在您的 foreach 中添加对作为产品名称的键的引用并分解值:

<dl>
    {foreach from=$grouped key=$key item=features}
        <dt>{$key}</dt>
        <dd>{", "|implode:$features}</dd>
     {/foreach}
</dl>