2012-05-08 2 views
1

У меня есть таблица Общая структура которого, как этотTree вопрос в PHP

---------------------------------- 
id | name  | parent_id 
------------------------------------ 
1  | root_category | Null 
2  | Appare  | 1 
3  | Accessories | 1 
4  | Shirt   | 2 
5  | Pants   | 2 
6  | hand Bags  | 3 
7  | jewelry  | 3 

И я хранить значение общей таблицы, используя из в моей таблице продукта

таблицы продуктов, которые содержат всю информацию о продукте

в таблице продуктов


p_id  | 1 
p_name  | bla 
p_weight | 250 
g_id  | 5  
g_name  | pants 
g_parent | 2 

я хочу, чтобы создать полное дерево с помощью

-> g_id -> g_name -> g_parent

дерево должно выглядеть следующим образом

Root Category 
- Apparel 
    -- Shirts 
    -- Pants 
- Accessories 
    -- Handbags 
    -- Jewelry 

я попробовал рекурсивную функцию, но ее не работает что

function get_categories($parent = $g_parent) 
{ 
    $html = '<ul>'; 
    $query = mysql_query("SELECT * FROM `general` WHERE `parent_id` = '$parent'"); 
    while($row = mysql_fetch_assoc($query)) 
    { 
     $current_id = $row['id']; 
     $html .= '<li>' . $row['name']; 
     $has_sub = NULL; 
     $has_sub = mysql_num_rows(mysql_query("SELECT COUNT(`parent_id`) FROM `general` WHERE `parent_id` = '$current_id'")); 
     if($has_sub) 
     { 
     $html .= get_categories($current_id); 
     } 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 
    return $html; 
} 

print get_categories(); 

но не работает .... :(

+1

И вам не пришло в голову записать, что происходит? – Nanne

+0

это сворачивает мою структуру –

+0

что это выводит? –

ответ

2

Вы должны попробовать это ... свой рабочий код .. также посмотреть скриншот вывода (вывод на экран)

<?php 

function get_categories(){ 

    $con = mysql_connect("localhost","root",""); 
    if (!$con){ 
     die('Could not connect: ' . mysql_error()); 
     } 

    mysql_select_db("stackoverflow", $con); 

    $result = mysql_query("SELECT g.`name` AS `category`, GROUP_CONCAT(gj.`name`) AS `name` 
    FROM `general` g INNER JOIN `general` gj ON g.`id` = gj.`parent_id` GROUP BY g.`id` "); 


    $i=0; 
    while($row = mysql_fetch_array($result)){ 
     $data[$i]['category'] = $row['category']; 
     $data[$i]['name'] = $row['name']; 
     $i++; 
    } 

    $html = $data[0]['category']."<br>"; 
    unset($data[0]); 

    foreach($data as $key => $listing){ 

     $html   .= " - ".$listing['category']."<br>"; 
     $exp    = explode(",",$listing['name']); 
     $count_exp = count($exp); 

     for($j=0; $j<=$count_exp-1;$j++){ 
      $html  .= " -- ".$exp[$j]."<br>"; 
     } 
    } 

    return $html; 
} 

print_r(get_categories()); 
?> 

Выход Экран

enter image description here

+0

Эй, @ МИТ любая путаница в отношении этого, пожалуйста, ответьте мне, и еще одна вещь - это рабочий код ... .. –

0

Изменить этот

print get_categories(); 

Для

print get_categories(1); 

пустая строка не будет соответствовать значение NULL в MySQL, поэтому вам нужно ввести свой начальный идентификатор. Если вы не хотите изменить свою функцию, чтобы выполнить дополнительную проверку, если $ parent равен null.

0

попробовать это с некоторыми изменениями:

function get_categories($parent) 
{ 
    $html = '<ul>'; 
    $query = mysql_query("SELECT * FROM `general` WHERE `parent_id` = '$parent'"); 
    while($row = mysql_fetch_assoc($query)) 
    { 
     $current_id = $row['id']; 
     $html .= '<li>' . $row['name']; 
     $has_sub = NULL; 
     $has_sub = mysql_num_rows(mysql_query("SELECT COUNT(`parent_id`) as count FROM `general` WHERE `parent_id` = '$current_id'")); // change here 
     if($has_sub['count'] > 0) // change here 
     { 
     $html .= get_categories($current_id); 
     } 
     $html .= '</li>'; 
    } 
    $html .= '</ul>'; 
    return $html; 
} 

print get_categories(1); // change here