как использовать Foreach (умный) в 3D-массиве?

как использовать foreach (smarty) в 3D-массиве?

я хочу, чтобы этот код получал cat_title и cat_id

но я не получаю sub_id и sub_title

я получаю категорию и подкатегорию.

я кодирую в TPL smary:

{foreach $catData as $cat}
  <ul class="catName">
      <lable>{$cat.cat_title}</lable>
       {foreach $subData as $sub}
            <li class="subName">{$sub.sub_title}</li>
        {/foreach}
   </ul>
{/foreach}

Я массив 3D:

cat_id и cat_title — это один элемент, но sub_id и sub_title — это еще один элемент. Все в одном массиве

массив(массив(cat_id[один элемент],cat_title[один элемент],sub_id[дополнительный элемент],sub_title[дополнительный элемент]))

Array
(
    [1] => Array
        (
            [cat_title] => Cat1 
            [cat_id] => 1
            [sub_id] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )

            [sub_title] => Array
                (
                    [0] => sub1
                    [1] => sub2
                    [2] => sub3
                    [3] => sub4
                )

        )

    [7] => Array
        (
            [cat_title] => Cat2
            [cat_id] => 7
            [sub_id] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                )

            [sub_title] => Array
                (
                    [0] => sub1
                    [1] => sub2
                    [2] => sub3
                )

        )

    [11] => Array
        (
            [cat_title] => Cat3
            [cat_id] => 11
            [sub_id] => Array
                (
                    [0] => 1
                    [1] => 2

                )

            [sub_title] => Array
                (
                    [0] => sub1
                    [1] => sub2
                )

        )

    [18] => Array
        (
            [cat_title] => Cat4
            [cat_id] => 12
            [sub_id] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4

                )

            [sub_title] => Array
                (
                    [0] => sub1
                    [1] => sub2
                    [2] => sub3
                    [3] => sub4

                )

        )
)

Я нашел ответ: многомерный массив php smarty loop

{foreach from=$catData item=catlist}
<ul class="catName">
    <lable data-catid="{$catlist.cat_id}">{$catlist.cat_title}</lable>
    {foreach from=$catlist.sub_title key=k item=sublist}
    <li class="subName" data-subid="{$catlist.sub_id.$k}">{$sublist}</li>
    {/foreach}
</ul>
{/foreach}

person user3770797    schedule 21.09.2014    source источник


Ответы (1)


Вы нашли решение, которое работает, но оно использует синтаксис Smarty2, а не более новый и чистый синтаксис Smarty 3.

В вашем случае, если у вас есть:

PHP-файл:

$data = Array
(
    1 => Array
    (
        'cat_title' => 'Cat1',
        'cat_id'    => 1,
        'sub_id'    => Array
        (
            0 => 1,
            1 => 2,
            2 => 3,
            3 => 4,
        ),
        'sub_title' => Array
        (
            0 => 'sub1',
            1 => 'sub2',
            2 => 'sub3',
            3 => 'sub4',
        )

    ),
    7 => Array
    (
        'cat_title' => 'Cat2',
        'cat_id'    => 7,
        'sub_id'    => Array
        (
            0 => 1,
            1 => 2,
            2 => 3,
        ),
        'sub_title' => Array
        (
            0 => 'sub1',
            1 => 'sub2',
            2 => 'sub3',
        )

    )
);


$smarty->assign('catData', $data);

Умный файл:

{foreach $catData as $cat}
    <ul class="catName">
        <label>{$cat.cat_title}</label>
        {foreach $cat['sub_title'] as $sub}
            <li class="subName">{$sub}</li>
        {/foreach}
    </ul>
{/foreach}

Вывод будет:

<ul class="catName">
    <label>Cat1</label>
                <li class="subName">sub1</li>
                <li class="subName">sub2</li>
                <li class="subName">sub3</li>
                <li class="subName">sub4</li>
        </ul>
<ul class="catName">
    <label>Cat2</label>
                <li class="subName">sub1</li>
                <li class="subName">sub2</li>
                <li class="subName">sub3</li>
        </ul>

как и ожидалось.

Если вы хотите, вы можете даже перечислить все элементы ваших массивов.

Для того же файла PHP вы можете использовать следующий файл Smarty:

{foreach $catData as $cat}
    {foreach $cat as $what => $item}
        <strong>{$what}</strong>:
        {if not $item|is_array}
            {$item}
        {else}
            {foreach $item as $value}
                <li class="subName">{$value}</li>
            {/foreach}
        {/if}
        <br />
    {/foreach}
{/foreach}

и теперь получит следующий вывод:

<strong>cat_title</strong>:
        Cat1
    <br />
<strong>cat_id</strong>:
        1
    <br />
<strong>sub_id</strong>:
                        <li class="subName">1</li>
                <li class="subName">2</li>
                <li class="subName">3</li>
                <li class="subName">4</li>
                <br />
<strong>sub_title</strong>:
                        <li class="subName">sub1</li>
                <li class="subName">sub2</li>
                <li class="subName">sub3</li>
                <li class="subName">sub4</li>
                <br />

<strong>cat_title</strong>:
        Cat2
    <br />
<strong>cat_id</strong>:
        7
    <br />
<strong>sub_id</strong>:
                        <li class="subName">1</li>
                <li class="subName">2</li>
                <li class="subName">3</li>
                <br />
<strong>sub_title</strong>:
                        <li class="subName">sub1</li>
                <li class="subName">sub2</li>
                <li class="subName">sub3</li>
                <br />

Вам также следует поработать над выводом HTML, потому что вы не можете поместить в список <ul> элементы, отличные от <li>, и вы использовали здесь неизвестный элемент <lable>.

person Marcin Nabiałek    schedule 21.09.2014