2011-07-11 26 views
1

商品合計を含む再帰的メニューを作成したいと思いますが、すでにTopmenuをレンダリングしていますので別の方法を見つけることができません。商品数のある再帰的メニュー

私のサイトを非常に遅くする可能性があるので、私はたくさんのMySQLクエリを使いたくありません。

コード私が使用しています:

require 'db.php'; 

$result = mysql_query("SELECT COUNT(c.category_id) AS count, c. category_id, c.parent_id, cd.name, p.product_id FROM category c 
    LEFT JOIN category_description AS cd ON (cd.category_id=c.category_id) 
    LEFT JOIN product_to_category AS ptc ON (ptc.category_id=c.category_id) 
    LEFT JOIN product AS P ON (p.product_id=ptc.product_id) 
    GROUP BY c.category_id  
    ORDER BY c.parent_id,cd.name") or die (mysql_error()); 

$menuData = array('items' => array(), 'parents' => array()); 

while ($menuItem = mysql_fetch_assoc($result)) { 
    $menuData['items'][$menuItem['category_id']] = $menuItem; 
    $menuData['parents'][$menuItem['parent_id']][] = $menuItem['category_id']; 
} 

function buildMenu($parentId, $menuData) { 
    $html = ''; 
    if (isset($menuData['parents'][$parentId])) 
    { 
     $html = '<ul>'; 

     foreach ($menuData['parents'][$parentId] as $itemId) { 
      $iCount = ($menuData['items'][$itemId]['product_id'] != NULL) ? $menuData['items'][$itemId]['count'] : '0'; 

      $html .= '<li>' . $menuData['items'][$itemId]['name'] . ' (' . $iCount . ') '; 
      $html .= buildMenu($itemId, $menuData); 
      $html .= '</li>'; 
     } 

     $html .= '</ul>'; 
    } 
    return $html; 
} 
echo buildMenu(0, $menuData); 

予想される出力:

Dell (1) 
--Computer(1) 
---DataCable(1) 
----Extra Sub (0) 

電流出力:

Dell (0) 
--Computer(0) 
---DataCable(1) 
----Extra Sub (0) 

答えて

0

私はあなたのクエリが間違った結果を返すと思います。 buildMenu()関数を呼び出す前に print '<pre>';print_r($menuData);print '</pre>';を使用し、クエリが正しいデータを返すかどうかを確認してください。

+0

私はそれぞれのカテゴリの数が正しいと思っていますが、私の問題はTopCatをレンダリングしてそこから降りてくることです。 私がダウンしたとき、トップカテゴリのカウントを得ることはできません。 最初にすべてを数える別の再帰関数が必要ですか? この問題のベストプラクティスは何ですか? – DirkZz

0

私は、これは正しい方向にあなたが近づくすべきだと思う:、再注文して

foreach ($menuData['parents'][$parentId] as $itemId) { 
    $menu = buildMenu($itemId, $menuData); 
    $item = $menuData['items'][$itemId]; 
    $iCount = ($item['product_id'] != NULL) ? $item['count'] : '0'; 
    $menuData['items'][$parentId]['count'] += $iCount; 
    $html .= '<li>' . $item['name'] . ' (' . $iCount . ') '; 
    $html .= $menu 
    $html .= '</li>'; 
} 

、その後、親項目の数を現在の項目の数を追加し、あなたが確認したときに出力ICOUNTことを確認することができますそれには子供の数もすべて含まれます。

$menuData['items'][$itemId]の一時変数も使用しました。その$ menuDataで3つの配列検索を行うだけなので、それほど効率的ではないかもしれませんが、読むのがはるかに簡単です。

関連する問題