如何循环多维数组
How to loop multidimensional array
在 Smarty 中如何在我的第二个 foreach 中循环 子值?
[test] => stdClass Object
(
[parent] => Test
[sub] => Array
(
[0] => Array
(
[key1] => Value 1
[key2] => Value 2
)
)
)
{foreach from=$menuList item=menu}
<li><a href="#">{$menu->name}</a>
<ul class="dropdown-menu">
{foreach from=$menu->sub key=k item=v}
<li class="dropdown-submenu" name=>{$v}</li>
{/foreach}
</ul>
{/foreach}
</li>
如何打印第二个 foreach key 和 value?
它只打印数组字符串
首先你的"array"实际上是对象。您需要先将其转换为数组才能使用该功能。这是一个可以做到这一点的函数:
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
很明显这是php函数,把它放在php文件或者smarty插件里就可以访问了。然后,这里有一个函数使用前面的函数来动态处理对象,或者任何输入。
function smarty_function_tree($params, &$smarty) {
if (!isset($params['level'])) {
$level = 0;
} else {
$level = $params['level'];
}
return tree($params['data'], $level);
}
function tree($data, $level) {
echo '<ul class="level', $level, '">', "\r\n";
$aData = objectToArray($data);
foreach ($aData as $key => $entry) {
if (is_array($entry)) {
echo '<li>', $key, '</li>', "\r\n";
tree($entry, $level+1);
} else {
echo '<li>', $key, ' = ', $entry, '</li>', "\r\n";
}
}
echo '</ul>', "\r\n";
}
创建一个根据函数名称调用的插件,然后你可以像这样在模板中使用它:
{tree data=$yourObject}
或
{tree data=$yourArray}
编辑:您还可以使用 css 的 litlebit 来缩进树函数的输出:
.level0 {
text-indent: 20px;
}
.level1 {
text-indent: 40px;
}
.level2 {
text-indent: 60px;
}
.level3 {
text-indent: 80px;
}
.level4 {
text-indent: 100px;
}
.level5 {
text-indent: 120px;
}
.level6 {
text-indent: 140px;
}
.level7 {
text-indent: 160px;
}
.level8 {
text-indent: 180px;
}
.level9 {
text-indent: 200px;
}
希望对您有所帮助!
如果您知道 key1
和 key2
,您可以:
{foreach from=$menu->sub key=k item=v}
key1 = {$v.key1}, key2 = {$v.key2}
{/foreach}
输出:
key1 = value1, key2 = value2
在你的例子中
{foreach from=$menuList item=menu}
<li><a href="#">{$menu->name}</a>
<ul class="dropdown-menu">
{foreach from=$menu->sub key=k item=v}
<li class="dropdown-submenu" name="{$v.key1}"></li>
{/foreach}
</ul>
{/foreach}
</li>
如果您不知道密钥,您需要另一个 loop:
{foreach from=$menu->sub key=k item=v}
{foreach from=$v key=u item=i}
{$u} = {$i},
{/foreach}
{/foreach}
输出:
key1 = value1, key2 = value2,
如果您有一个 对象,您可以使用 ->
。如果您有 Array 使用 .
或 []
在 Smarty 中如何在我的第二个 foreach 中循环 子值?
[test] => stdClass Object
(
[parent] => Test
[sub] => Array
(
[0] => Array
(
[key1] => Value 1
[key2] => Value 2
)
)
)
{foreach from=$menuList item=menu}
<li><a href="#">{$menu->name}</a>
<ul class="dropdown-menu">
{foreach from=$menu->sub key=k item=v}
<li class="dropdown-submenu" name=>{$v}</li>
{/foreach}
</ul>
{/foreach}
</li>
如何打印第二个 foreach key 和 value?
它只打印数组字符串
首先你的"array"实际上是对象。您需要先将其转换为数组才能使用该功能。这是一个可以做到这一点的函数:
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
很明显这是php函数,把它放在php文件或者smarty插件里就可以访问了。然后,这里有一个函数使用前面的函数来动态处理对象,或者任何输入。
function smarty_function_tree($params, &$smarty) {
if (!isset($params['level'])) {
$level = 0;
} else {
$level = $params['level'];
}
return tree($params['data'], $level);
}
function tree($data, $level) {
echo '<ul class="level', $level, '">', "\r\n";
$aData = objectToArray($data);
foreach ($aData as $key => $entry) {
if (is_array($entry)) {
echo '<li>', $key, '</li>', "\r\n";
tree($entry, $level+1);
} else {
echo '<li>', $key, ' = ', $entry, '</li>', "\r\n";
}
}
echo '</ul>', "\r\n";
}
创建一个根据函数名称调用的插件,然后你可以像这样在模板中使用它:
{tree data=$yourObject}
或
{tree data=$yourArray}
编辑:您还可以使用 css 的 litlebit 来缩进树函数的输出:
.level0 {
text-indent: 20px;
}
.level1 {
text-indent: 40px;
}
.level2 {
text-indent: 60px;
}
.level3 {
text-indent: 80px;
}
.level4 {
text-indent: 100px;
}
.level5 {
text-indent: 120px;
}
.level6 {
text-indent: 140px;
}
.level7 {
text-indent: 160px;
}
.level8 {
text-indent: 180px;
}
.level9 {
text-indent: 200px;
}
希望对您有所帮助!
如果您知道 key1
和 key2
,您可以:
{foreach from=$menu->sub key=k item=v}
key1 = {$v.key1}, key2 = {$v.key2}
{/foreach}
输出:
key1 = value1, key2 = value2
在你的例子中
{foreach from=$menuList item=menu}
<li><a href="#">{$menu->name}</a>
<ul class="dropdown-menu">
{foreach from=$menu->sub key=k item=v}
<li class="dropdown-submenu" name="{$v.key1}"></li>
{/foreach}
</ul>
{/foreach}
</li>
如果您不知道密钥,您需要另一个 loop:
{foreach from=$menu->sub key=k item=v}
{foreach from=$v key=u item=i}
{$u} = {$i},
{/foreach}
{/foreach}
输出:
key1 = value1, key2 = value2,
如果您有一个 对象,您可以使用 ->
。如果您有 Array 使用 .
或 []