2012-03-20 16 views
2

私はこのコードを動作させる方法を理解しようとしています。基本的に私は複数の値を含む連想配列をフェッチするためにMySQLを使用しました。データベースから4次元配列を作成する方法

例データベース:データベース名=製品

----------------------------------------------------------------. 
| 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。 BM。

+0

私はpferateからHTMLループとnnicolsからSQLクエリの組み合わせを使用し、それは完全に働きました。私はあなたの助けに感謝します。 – BabediMessiah

答えて

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"; 
+0

ありがとう、これは本当に私を助けた!あなたのソリューションとnnicolsの両方のソリューションを使用しているため、私はあなたに正しい回答クレジットを与えることはできません。助けてくれてありがとう! – BabediMessiah

2

あなたはmysqlは結果セットをソートしてみましょうことができます:

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

その後することができます単に結果をループ。オーバーカテゴリ、カテゴリ、サブカテゴリが変更されるたびに、新しいヘッダが出力されます。

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

に探しするより重要な問題は、あなたのテーブル構造である - についてどのように

+0

おそらく製品 '名前'でソートする必要があります... –

1

。オーバーカテゴリ、カテゴリ、およびサブカテゴリが階層の一部であると仮定すると、製品が属するリーフノードのみを格納し、おそらくFKである整数としてcategories(id, name, parent_id)テーブルに格納する必要があります。私は製品カタログのネストされたセットを選択する傾向がありますが、それは要件に依存します。

さらに、個々の製品を複数のカテゴリで表すのが一般的です。その場合、カテゴリ関係を結合表products_categories(product_id, category_id)に移動する必要があります。

思考のためのちょっとした食べ物。

+0

これは、すべての単一のサブカテゴリに対して1つのレベルのメニューしか生成しないように見えます。また、個々の製品名のような外観は無視されます。何か不足していますか? –

+0

彼はOPが記述したネストされた配列を生成しています。それはおそらくそれを行う最も簡単な方法であり、私はそれをどうやってやるのだろう。製品名は最後の '[]'で、デフォルトの番号付き配列キーとともに追加されています。他の人は結果から名前のついたキーを使用しています。 – pferate

+0

@ebyrob - それを指摘してくれてありがとう。私は '[]'の最後のペアを見逃しましたが、残りの部分はうまく動作します。 @pferate - 歓声! – nnichols

関連する問題