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>
我有一个多维数组,想生成一个定义列表,该列表按名称分组,值以逗号分隔。
通过 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>