Как зациклить многомерный массив - PullRequest
0 голосов
/ 19 декабря 2018

В 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 ?

Он печатает только строку массива

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Если вы знаете 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>

Если вы не знаете ключ, вам нужен еще один цикл :

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

выход:

key1 = value1, key2 = value2,

Если у вас есть Объект , вы используете ->.Если у вас есть Array , используйте . или []

0 голосов
/ 21 декабря 2018

Прежде всего ваш «массив» на самом деле является объектом.Вам нужно сначала преобразовать его в массив, чтобы использовать эту функцию.Вот функция, которая может сделать это:

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 для отступа в выводе функции дерева:

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

Надеюсь, это поможет!

...