【问题标题】:How to loop multidimensional array如何循环多维数组
【发布时间】:2018-12-19 15:01:24
【问题描述】:

在 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 keyvalue

只打印数组字符串

【问题讨论】:

  • 您能否edit 显示当前输出是什么,以及您想要什么输出?
  • 它显示 Array....

标签: arrays smarty


【解决方案1】:

首先,您的“数组”实际上是对象。您需要先将其转换为数组才能使用该函数。这是一个可以做到这一点的函数:

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;
}

希望对你有帮助!

【讨论】:

    【解决方案2】:

    如果您知道key1key2,您可以这样做:

    {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>
    

    如果您不知道密钥,则需要另一个 循环

    {foreach from=$menu->sub key=k item=v}
        {foreach from=$v key=u item=i}
            {$u} = {$i},
        {/foreach}
    {/foreach}
    

    输出:

    key1 = value1, key2 = value2,
    

    如果你有一个对象,你使用-&gt;。如果你有 Array 使用.[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2018-07-30
      • 2013-06-25
      • 2015-06-02
      • 2019-07-17
      • 2012-05-13
      • 1970-01-01
      相关资源
      最近更新 更多