【问题标题】:How do i create a 4 dimensional array from a database如何从数据库创建 4 维数组
【发布时间】:2012-04-05 08:22:24
【问题描述】:

我正试图弄清楚如何使这段代码工作。基本上我已经使用 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。

【问题讨论】:

  • 我结合使用了 pferate 的 html 循环和 nnicols 的 sql 查询,它运行良好。感谢您的帮助。

标签: php mysql multidimensional-array


【解决方案1】:

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

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

然后你可以简单地循环结果。每当过度类别、类别、子类别发生变化时,您都会输出一个新的标题。

【讨论】:

    【解决方案2】:

    如果您在 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";
    

    【讨论】:

    • 谢谢,这对我很有帮助!我不能给你正确的答案,因为我使用了你的解决方案和 nnicols 的解决方案。非常感谢您的帮助!
    【解决方案3】:

    怎么样-

    $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 是层次结构的一部分,那么您应该只存储产品所属的叶节点,并且应该将其存储为一个整数,该整数是 categories(id, name, parent_id) 表的 FK。我倾向于为产品目录选择嵌套集,但这取决于要求。

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

    只是一点思考的食物。

    【讨论】:

    • 看起来这只会为每个子类别生成一个级别的菜单。此外,看起来个别产品名称会被忽略。我错过了什么吗?
    • 他正在生成 OP 描述的嵌套数组。这可能是最简单的方法,也是我将如何做到的。产品名称与最后一个 [] 一起添加,并带有默认编号的数组键。其他人正在使用从结果中命名的键。
    • @ebyrob - 感谢您指出这一点。我确实错过了最后一对[],但其余的工作正常。 @pferate - 干杯!
    • 谢谢,这对我很有帮助!我不能给你正确的答案,因为我同时使用了你的解决方案和 pferate 的解决方案。非常感谢您的帮助!
    • 在这种情况下,请归功于@pferate。最好将问题标记为已回答。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多