如何从数据库创建4维数组

时间:2012-03-20 20:03:19

标签: php mysql multidimensional-array

我试图弄清楚如何让这段代码发挥作用。基本上我使用MySQL来获取包含多个值的关联数组。

示例数据库:数据库名称=产品

 ----------------------------------------------------------------.
|   name     | overcategory |   category   |     subcategory     |
|  Talon     |    null      | stud welding | capacitor discharge |
| cdss m3x40 | studs/bolts  |   cd-studs   |   stainless steel   |
----------------------------------------------------------------.

我使用了句子SELECT name, overcategory, category, subcategory FROM Products WHERE 1 = 1;

在实际数据库中有更多条目,但它们与此问题无关。

我希望将结果作为菜单输出到屏幕的左侧。

<nav>
   <h1> "$overcategory" </h1>
     <h2> "$category" </h2>
         <h3> "$subcategory" </h3>
           <a href = "">$productname </a>
           <a href = "">$productname3 </a>

   <h1> "$overcategory2" </h1>
     <h2> "$category2" </h2>
         <h3> "$subcategory2" </h3>
           <a href = "">$productname2 </a>
</nav>

我想通过创建一个看起来像这样的多维数组来做到这一点:

    $testArray = array(
        ''=>array(
              'Boltsveiseapparater'=>array(
                            'Kondensator'=>array(
                                         'Talon',
                                         'LBS-75'
                                        ),
                                    'Arc'=>array(
                                         'LBH-410',
                                         'LBH-800'
                                        )
                                  )
            ),
            'Pinner/bolter'=>array(
                                        'CD-pinner'=>array(
                                                            'rustfri'=>array(
                                                                            'cdss m3x35',
                                                                            'cdss m3x40'
                                                                            ),
                                                              'stål'=>array(
                                                                            'cdms m3x35',
                                                                            'cdms m6x35'
                                                                            ),
                                                                'Alu'=>array(
                                                                            'cdal m3x10',
                                                                            'cdal m8x80'
                                                                            )
                                                        ),
                                        'Bossinger'=>array(
                                                            'Stål'=>array(
                                                                            'M6x10 5x8',
                                                                            'M5x12 4x10'
                                                                            ),
                                                                'Alu'=>array(
                                                                            'M6x10 5x8',
                                                                            'M5x12 4x10'
                                                                            ),
                                                            'Rustfri'=>array(
                                                                            'M6x10 5x8',
                                                                            'M5x12 4x10'
                                                                            )
                                                        )
                                )

      );                                                                        

我不知道如何通过循环结果来做到这一点。有没有办法做到这一点,而不是制造一大堆厄运?如果没有,有人可以协助我解决这个难题。

提前谢谢你。 BM。

3 个答案:

答案 0 :(得分:2)

你可以让mysql对结果集进行排序:

SELECT name, overcategory, category, subcategory FROM Products ORDER BY overcategory,category,subcategory;

然后你可以简单地循环结果。每当overcategory,category,subcategory更改时,您输出一个新标头。

答案 1 :(得分:1)

怎么样 -

$res = mysql_query('SELECT name, overcategory, category, subcategory FROM Products WHERE 1 = 1 ORDER BY overcategory,category,subcategory, name;');

$aMenu = array();

while($row = mysql_fetch_assoc($res)) {
    $aMenu[$row['overcategory']][$row['category']][$row['subcategory']][] = $row['name'];
}

要研究的一个更重要的问题是您的表结构。假设overcategory,category和subcategory是层次结构的一部分,那么您应该只存储产品所属的叶节点,并且应该存储为FK到categories(id, name, parent_id)表的整数。我倾向于选择产品目录的嵌套集,但这取决于要求。

此外,单个产品通常以多个类别表示,在这种情况下,您需要将类别关系移动到连接表products_categories(product_id, category_id)

只是一点思考。

答案 2 :(得分:1)

如果在SQL查询中对结果的每一列进行排序,则可以循环遍历每个结果并将其与最后一个条目进行比较,并根据该结果调整输出。

SELECT name, overcategory, category, subcategory FROM Products ORDER BY overcategory, category, subcategory, name;

否则,这是处理嵌套数组的一种方法:

<?php

echo "\n";
echo "<nav>\n";
foreach ($testArray as $overcategory_name => $category_data) {
    echo "\t<h1>$overcategory_name</h1>\n";
    foreach ($category_data as $category_name => $subcategory_data) {
        echo "\t\t<h2>$category_name</h2>\n";
        foreach ($subcategory_data as $subcategory_name => $product_name_data) {
            echo "\t\t\t<h3>$subcategory_name</h3>\n";
            foreach ($product_name_data as $product_name) {
                echo "\t\t\t\t<a href = \"\">$product_name</a>\n";
            }
        }
    }
}
echo "</nav>\n";