Итерация многомерного массива Smarty - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть два массива.В первом массиве у меня есть имена полей Type и Zone.Эти два имени поля имеют несколько значений.Я использую Smarty.Я хочу, чтобы имя выбора из первого массива и параметры для каждого раскрывающегося списка будут поступать из второго массива.Вот что я пробовал:

{foreach from=$field_names item=fld_name}
        <tr>
            <td width="3%" height="15" style="font-weight:bold;height:30px; padding-top:5px;">&nbsp;</td>
            <td width="32%" height="15" valign="middle" style="font-weight:bold;height:30px; padding-top:5px;">&nbsp;{$fld_name}:</td>
            <td width="65%" height="15" valign="middle" style=" padding-top:5px;"> 
                <select name="{$fld_name}" id="{$fld_name}" style="width:95px">
                    <option value="-1">Any</option>
                    {foreach from=$field_values item=fld_val key=key}
                        <option value="{$fld_val.$key.value}">{$fld_val.$key.value}</option>
                    {/foreach}
                </select> 
            </td>
        </tr>
        {/foreach}

Это вывод массивов:

This is the Output of first array:

Array ([2] => Type [1] => Zone)

Это второй массив: Array ([0] => Array ([0] => Array ([productid] => 141 [fieldid] => 2 [value] => Laptop)

        [1] => Array
            (
                [productid] => 191
                [fieldid] => 2
                [value] => Books
            )

        [2] => Array
            (
                [productid] => 177
                [fieldid] => 2
                [value] => Printer
            )

    )

[1] => Array
    (
        [0] => Array
            (
                [productid] => 141
                [fieldid] => 1
                [value] => 3
            )

        [1] => Array
            (
                [productid] => 191
                [fieldid] => 1
                [value] => 4
            )

        [2] => Array
            (
                [productid] => 177
                [fieldid] => 1
                [value] => 2
            )

    )

)

Я получаю одинаковые опции в обоих выпадающих меню. Что я делаю не так, пожалуйста, помогите ..

Заранее спасибо.

1 Ответ

2 голосов
/ 20 сентября 2011

Первый раз; первый массив имеет идентификаторы 2 и 1, сопоставленные соответственно типу и зоне. Ваш первый умный foreach будет циклически проходить через этот массив и тип продукта и зону в качестве значений переменной $ fld_name.

Второй foreach, однако, выполняется без какого-либо отношения к первому; поэтому обе итерации этого массива будут одинаковыми.

Мне кажется, у меня похожая ситуация в одном из моих шаблонов Smarty; но так как я на работе, я не могу на них взглянуть: (.

В любом случае; Я считаю, что я создал либо объект, либо массив с именами в качестве индексов; так что в вашем случае параметры для Type будут во втором массиве под индексом «Type», то же самое для Zone. Таким образом, вы можете перейти через вторую часть массива, которая принадлежит данному ключу:

{foreach $field_names as $field_name}
    ...
    {foreach $field_values[$field_name] as $field_value}
        ...
    {/foreach}
{/foreach}

Ваш второй массив изменится с «0» и «1» в качестве индексов для массивов значений, на «Тип» и «Зона». Такая конструкция должна уметь работать.

Пример приведенного выше кодовой панели см. http://codepad.org/kzfaYuSd. Я полагаю, что в некоторой степени то же самое, что вы пытаетесь выполнить с массивами. Это все еще означает изменение массивов; но в противном случае вы, вероятно, будете использовать много логики в шаблоне smarty, что делает их нечитаемыми. К сожалению, кодовая панель не имеет смысла; но я знаю, что smarty может делать то же самое с утверждениями foreach:).

Вторичный подход заключается в создании объекта для поля, состоящего из имени поля и значений поля в качестве свойств:

$items = new array();
$item1 = new StdObject();
$item1->field_name = "Type";
$item1->field_values = new array("Value1", "Value2");
$items[] = $item1;

А затем в smarty (при условии, что $ items сопоставлен с $ items):

{foreach $items as $item}
    $item->field_name
    {foreach $item->field_values as $value}
         $value
    {/foreach}
{/foreach}

(конечно, включая ваш собственный код вокруг этих значений:)).

Кодовая панель, иллюстрирующая последнее: http://codepad.org/flIhRlmO

Удачи!

...