2011-02-13 82 views
0

我无法创建脚本,其中某个子类别的产品需要在某个DIV内打印。目前,我正在提取所需的所有数据,但目前发生的情况是,例如,如果我有4个类别,它会创建4次DIV,但DIV中的产品都是相同的,但我需要它们是特定于相关类别,希望有道理。这是我到目前为止:PHP foreach子类别问题

$categories = getCategories(); 

     foreach($categories as $category) 
     { 
     echo '<div class="panel"> 
      <div class="panel-wrapper"><pre>'; 
      echo print_r(getProducts($category['id_category'])); 
      echo '</pre> 
       <h2 class="title">ff</h2>'; 


     echo '</div> 
     </div>'; 
     } 

$ categories = array('1','2','3'); 产品拉到这样

$i = 0; 
while ($row = mysql_fetch_assoc($result)) 
{ 
    $products[$i] = $row; 
    $i++; 
} 
return $products; 

将返回:

Array 
(
    [0] => Array 
     (
      [title] => Hat 
      [description] =>nice description 
      [visible] => 1 
      [date-added] => 2011-02-10 20:02:02 
      [date-updated] => 0000-00-00 00:00:00 
      [price] => 10 
      [id_category] => 2 
     ) 
    [1] => Array etc etc etc 
) 

我很新的PHP,所以我不知道如何没有一个foreach这是我觉得我跑这个循环会错的。

在此先感谢!

+0

你的getProducts()做了什么?现在看起来您正在为类别循环的每个迭代运行查询,如果您有很多类别,这可能会非常低效。 – 2011-02-13 00:48:12

回答

1

首先,我想提一下,类别和子类别应该在同一个数据库表中,并且子类别应该使用字段(例如subcategory_of)进行标记,并且应该与类别的ID关联。因此,我们不会混用ID,因为产品可能属于两个类别或子类别。

初始化一个通用数组,该数组将会变为$array['category']['subcategory']['product_id'],或者在某些情况下,产品可能直接位于没有子类别分类的类别中。 您不必这样做,只需打印输出而不将它们保存在数组中。通过他们

运行从类别开始,为每个类别:

  1. 检查类别有子类别,如果这样做,得到的产品,子类别下。
  2. 检查类别内是否有任何产品。

所以,你将有什么是与此类似:

$cat = 0; 
$categories = getCategories(); 

foreach ($categories as $category) { 
    // If you want to print something about the category, do it here. 
    $subcategories = getSubcategories($category_id); 

    $subcat = 0; 
    foreach ($subcategories as $subcategory) { 
     $products = getProducts($category_id_for_subcategory) // see note 1 

     foreach ($products as $product) { 
      // This product is under a subcategory. Do what you want here. 
      $array[$cat][$subcat++][] = $product; // or echo the product... 
     } 
    } 

    $products = getProducts($category_id); 
    foreach ($products as $product) { 
     // This product is under a general category, and not a subcategory. 
     // Do what you want to do with this product here. 
     $array[$cat++][] = $product; // or echo the product. 
    } 
} 

注1:每个子类也被认为是一类,所以我们将在这里使用的子类别类别ID。但是,当我们将子类别放入数组中时,我们只应该得到与getSubcategories方法的参数中提供的$category_id相关联的子类别。而这些“get方法”应该返回数组,所以我们可以通过它们循环。

注意2:我知道这是写这段代码的潜在危险方式,因为我们每次在foreach循环中迭代时都要查询数据库。就像Marc所说,如果你有很多类别和产品,这可能是非常低效的。我这样写的原因是因为它很冗长,并且允许一个新程序员理解我们所做事情背后的想法更容易(至少,这让我更容易理解它)。

我希望这可以让你的事情变得清晰。