Как создать 4-мерный массив из базы данных - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь выяснить, как заставить этот код работать.В основном я использовал 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 ]

2 голосов
/ 21 марта 2012

Вы можете позволить mysql отсортировать набор результатов:

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

Тогда вы можете просто зациклить результат. Всякий раз, когда изменяется сверхкатегория, категория, подкатегория, вы выводите новый заголовок.

1 голос
/ 21 марта 2012

Если вы сортируете каждый из столбцов ваших результатов в своем запросе 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";
1 голос
/ 21 марта 2012

Как насчет -

$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'];
}

Более важной проблемой является структура таблицы.Предполагая, что сверхкатегория, категория и подкатегория являются частью иерархии, вам следует хранить только конечный узел, к которому принадлежит продукт, и который, вероятно, следует хранить как целое число, являющееся FK для таблицы categories(id, name, parent_id).Я склонен выбирать вложенные наборы для каталогов продуктов, но это зависит от требований.

Кроме того, отдельные продукты обычно представлены более чем в одной категории, и в этом случае вам необходимо переместитьотношение категории к соединительному столу products_categories(product_id, category_id).

Просто немного пищи для размышлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...