2012-04-06 4 views
4

私は現在、PDOのfetchAll()関数を使用してデータベースからメニューデータを取得しています。以下の構造の配列へのクエリ結果の各行を置くそうする:重複した値を持つMySQL結果から多次元のネストした配列を作成する(PHP)

Array ( 
      [MenuName] => Main Menu 
      [MenuId] => mmnlinlm08l6r7e8ju53n1f58 
      [Section] => Array ( 
           [SectionId] => eq44ip4y7qqexzqd7kjsdwh5p 
           [SubmenuName] => Salads & Appetizers 
           [Items] => Array (
                [ItemName] => Tomato Salad 
                [Description] => Cucumbers, peppers, scallions and cured tuna 
                [Prices] => Array (
                     [PriceId] => xksjslkajiak1 
                     [Price] => $7.00) 
               ) 

           [SectionId] => xlkadsj92laada9082lkas 
           [SubmenuName] => Entrees 
           [Items] => Array (       
                [ItemName] => Portabello Carpaccio 
                [Description] => Dried tomatoes, pin nuts, mahon cheese 
                [Prices] => Array (
                     [PriceId => alkadh29189s09 
                     [Price] = $8.00) 
               ) 
           ) 
) 

Array ( 
     [0] => Array ( 
         [MenuId] => mmnlinlm08l6r7e8ju53n1f58 
         [MenuName] => Main Menu 
         [SectionId] => eq44ip4y7qqexzqd7kjsdwh5p 
         [SubmenuName] => Salads & Appetizers 
         [ItemName] => Tomato Salad 
         [Description] => Cucumbers, peppers, scallions and cured tuna 
         [Price] => $7.00) 
     [1] => Array ( 
         [MenuId] => mmnlinlm08l6r7e8ju53n1f58 
         [MenuName] => Main Menu 
         [SectionId] => xlkadsj92laada9082lkas 
         [SubmenuName] => Entrees 
         [ItemName] => Portabello Carpaccio 
         [Description] => Dried tomatoes, pin nuts, mahon cheese 
         [Prices] => $18.00) 
)      
         ...etc. 

解析の理由から、私は、配列なし重複値と入れ子構造に表示されたいと思います

n00bプログラマとして、私はこの新しい多次元配列を作成する方法を理解しようとしている最後の日に私の頭脳を悩ましてきました。 foreachステートメントと参照を入れ子にしなければならないかもしれないようですが、動かすのに苦労しました。

どのように私はそうすることができます知っていますか?

+0

があなたのデータ厳密に階層的で何をしたいあなたはそれを作ることができるだけの小さな変更で

$array = array() ; while ($row = PDO::fetchAll()) // Replace with relevant Information { $section = array(); $items = array(); $prices = array(); if(!array_key_exists($row['MenuId'], $array)) { $array[$row['MenuId']] = array(); $array[$row['MenuId']]['MenuName'] = $row['MenuName'] ; $array[$row['MenuId']]['MenuId'] = $row['MenuId'] ; $array[$row['MenuId']]['Section'] = array(); } if(!array_key_exists($row['SectionId'], $array[$row['MenuId']]['Section'])) { $array[$row['MenuId']]['Section'][$row['SectionId']] = array(); $array[$row['MenuId']]['Section'][$row['SectionId']]['SectionId'] = $row['SectionId'] ; $array[$row['MenuId']]['Section'][$row['SectionId']]['SubmenuName'] = $row['SubmenuName'] ; $array[$row['MenuId']]['Section'][$row['SectionId']]['Items'] = array() ; } $items['ItemName'] = $row['ItemName'] ; $items['Description'] = $row['Description'] ; $prices['PriceId'] = $row['PriceId'] ; $prices['Price'] = $row['Price'] ; $items['Prices'] = $prices ; $section['Items'] = $items ; $array[$row['MenuId']]['Section'][$row['SectionId']]['Items'][] = $items ; } var_dump($array); 

探しているもの?言い換えれば、項目は常にサブメニューにグループ化され、サブメニューはセクションにグループ化され、セクションはメニューにグループ化されますか? もしそうなら、あなたのSQLクエリでそれらを(メニュー、セクション、サブメニュー)並べ替え、結果を繰り返しながら、各レベルが変更されていないことを確認して配列を追加してください。 – Aerik

+0

こんにちはAerik、はい、各項目は常にサブメニューにグループ化され、各サブメニューはメニューにグループ化されます。私のSQL結果は、このように順序付けされているので、たとえば、メインメニュー>前菜のすべての項目は一緒にグループ化されます。 – idubs11

答えて

2

これがどのように見えるあなたが

+0

そのババをありがとう。あなたのソリューションがリソースを大幅に節約するように見えます(「致命的なエラー:最大実行時間が10秒を超えました」)。 – idubs11

+0

@ idubs11私は限られたリソースで作業していました...あなたが扱っているデータのサイズについてはわかりません...フォーマットを使用したいもの..より詳細な情報を与えたら、回答 – Baba

+0

典型的なクエリの結果は約50〜150行です。書式設定されたデータは解析され、phtmlで表示されます。 – idubs11

関連する問題