多维数组迭代Smarty

时间:2011-09-20 10:09:00

标签: php multidimensional-array foreach drop-down-menu smarty

我有两个数组。在第一个数组中,我有Type和Zone字段名称。这两个字段名称具有多个值。我用得很聪明。我想从第一个数组中选择名称,每个下拉列表的选项将来自第二个数组。这就是我的尝试:

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

阵 (     [2] =&gt;类型     [1] =&gt;区 )

这是第二个数组: 排列 (     [0] =&gt;排列         (             [0] =&gt;排列                 (                     [productid] =&gt; 141                     [fieldid] =&gt; 2                     [value] =&gt;笔记本电脑                 )

        [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 个答案:

答案 0 :(得分:2)

首先关闭;第一个数组的id为2,1分别映射到Type和Zone。您的第一个聪明的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'变为值数组的索引,变为'Type'和'Zone'。这种结构应该能够起作用。

有关上述代码示例的示例,请参阅http://codepad.org/kzfaYuSd。我相信这与您尝试使用数组完成的操作有些相同。它仍然意味着改变阵列;但是否则你可能会在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

祝你好运!