2013-03-23 76 views
1

循环嵌套数组我有2个MySQL表,在那里我有以下SQL语句提取数据:创建与PHP和MySQL

分类:SELECT cat_id, cat_name FROM categories

产品:SELECT pro_id, pro_name, pro_category FROM products

当然,pro_categorycat_id

外键我想达到以下JSON数据:

"categories":[ 
    { 
     "id": 1, 
     "name": "Guitars", 
     "products":[ 
      { 
       "id": 1, 
       "name": "Fender Statocaster" 
      }, 
      { 
       "id": 2, 
       "name": "Gibson Les Paul" 
      } 
     ] 
    }, 
    { 
     "id": 2, 
     "name": "Basses", 
     "products":[ 
      { 
       "id": 3, 
       "name": "Fender Jazz Bass" 
      }, 
      { 
       "id": 4, 
       "name": "MusicMan StingRay" 
      } 
     ] 
    } 
] 

所以我必须做一个类别的数组,并为每个元素,产品的子数组(然后我会去与json_encode())。

通过类别循环并创建第一个数组很容易,但我完全停留在如何创建产品子数组...这是我的代码,问号是我停下来的地方,因为我不知道该怎么办:

$categories = array(); 
while ($row_rsCategories = mysql_fetch_assoc($rsCategories)) { 
    $categories[] = array(
     'id' => $row_rsCategories['cat_id'], 
     'name' => $row_rsCategories['cat_name'], 
     'products' => array(
      ??????? 
     ), 
    ); 
} 

请问,你能帮忙吗?
谢谢!

回答

4
$categories = array(); 
while ($row_rsCategories = mysql_fetch_assoc($rsCategories)) { 

    $product_array = array(); 
    $product_array_query = mysql_query("SELECT pro_id, pro_name, pro_category FROM products WHERE pro_category = '".$row_rsCategories['cat_id']."'"); 

    while($product_array_fetch = mysql_fetch_array($product_array_query)) { 

     $product_array[] = array("id"=>$product_array_fetch['pro_id'],"name"=>$product_array_fetch['pro_name']); 

    }     

    $categories[] = array(
     'id' => $row_rsCategories['cat_id'], 
     'name' => $row_rsCategories['cat_name'], 
     'products' => $product_array, 
    ); 
} 
+0

Thnaks,这个作品!产品查询是否会影响性能? – Ivan 2013-03-23 13:15:41

+0

@Ivan:我想你将不得不使用inner for循环。请考虑使用'PHP PDO'或'mysqli extentions'来代替默认的'mysql_ *'函数,因为php社区不再推荐它们,并且容易受到像'mysql injection'这样的安全威胁的攻击。 – mithunsatheesh 2013-03-23 13:28:04

0
$categories = array(); 
while ($row_rsCategories = mysql_fetch_assoc($rsCategories)) { 
    $categories[$row_rsCategories['cat_id']] = array(
     'id' => $row_rsCategories['cat_id'], 
     'name' => $row_rsCategories['cat_name'], 
     'products' => array(), 
    ); 
} 

while ($row_rsProducts = mysql_fetch_assoc($rsProducts)) { 
    $categories[$row_rsProducts['pro_category']]['products'][] = array(
     'id' => $row_rsProducts['pro_id'], 
     'name' => $row_rsProducts['pro_name'], 
    ); 
} 
-1

我使用JOIN查询其类别ID订购产品,使产品所属的类别将走到一起。如果看到cat_id更改,则遍历结果数组并创建新的类别。

$db = new PDO($connectionString); 

$sql = "SELECT * FROM products t1 LEFT JOIN categories t2 ON t1.pro_category = t2.cat_id ORDER BY t2.cat_id"; 
$stmt = $db->prepare($sql); 
if($stmt->execute()) 
{ 
    $rows = $stmt->fetchAll(); 
    $currentCategory = NULL; 
    $categories = array(); 
    foreach($rows as $r) 
    { 
     if ($currentCategory == NULL || $r['cat_id' != $currentCategory['id']) 
     { 
      $currentCategory = array(
       'id' => $r['cat_id'], 
       'name' => $r['cat_name'], 
       'products' => array(); 
      ); 
      $categories[] = $currentCategory; 
     } 
     $currentCategory['products'][] = array(
      'id' => 'pro_id', 
      'name' => 'pro_name', 
     ) 
    } 
} 
else 
{ 
    var_dump($stmt->errorInfo()); 
}