2012-05-24 4 views
0

에 의해 구조적 배열을 만들기 나는 테이블을 가지고 내가 재귀 적으로 아래 그림과 같이 표시 할재귀 함수

enter image description here

나는 PHP에서 재귀 함수를 사용하고

enter image description here

function reccall($cat_id) 
{ 
    global $no,$recArray; 
    $sql = "SELECT a.* 
     FROM cat_master 
      WHERE 
     parent_id = $cat_id 
     ORDER BY 
     id ASC 
     "; 
     $result = mysql_query($sql) or die("Could not fetech Recursively"); 
    while($row = mysql_fetch_object($result)) 
    { 
     $recArray[$no]['value'] = mysql_real_escape_string($row->value); 
     $recArray[$no]['id'] = $row->id; 
     ++$no; 
     reccall($row->id); 
    } 
    return $recArray;  
} 

하지만 순서가 그림이 아닌 것처럼 구조화 된 배열을 생성 할 수 없습니다. 간단한 배열이 항상 생성됩니다. 누구나 위에 표시된 순서와 같은 구조화 된 배열을 만드는 데 도움이 될 수 있습니다.

+0

당신 수도 좋아 [MySQL은 관리 계층 데이터 (http://mikehillyer.com/articles/managing-hierarchical- data-in-mysql /) Mike Hillyer – Treffynnon

+0

대신 [Closure Tables] (http://karwin.blogspot.com/2010/03/rendering-trees-with-closure-tables.html)를 사용해야합니다. 또는 적어도 : [SQL Antipatterns] (http://pragprog.com/book/bksqla/sql-antipatterns) 책을 읽으십시오. –

+2

또한 고대의 mysql_ * 함수를 사용하여 새로운 코드를 작성하는 것을 중단하십시오. 더 이상 유지 관리되지 않으며 커뮤니티에서 [지원 중단 프로세스] (http://goo.gl/KJveJ)를 시작했습니다. 대신 [prepared statements] (http://goo.gl/vn8zQ)에 대해 알아야하고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용해야합니다. mysqli). 결정할 수없는 경우 [이 기사] (http://goo.gl/3gqF9)를 선택하면 도움이됩니다. 당신이 배우고 싶다면 [여기 PDO 관련 튜토리얼] (http://goo.gl/vFWnC)을 참조하십시오. –

답변

1

이 기능을 사용하는 대신 기능과 문제가 내가

희망 해결할 수
function reccall($cat_id) 
{ 
    $sql = "SELECT a.* 
     FROM cat_master 
      WHERE 
     parent_id = $cat_id 
     ORDER BY 
     id ASC 
     "; 
     $result = mysql_query($sql) or die("Could not fetech Recursively"); 
    while($row = mysql_fetch_object($result)) 
    { 
     $recArray[$no]['main']['value'] = mysql_real_escape_string($row->value); 
     $recArray[$no]['main']['id'] = $row->id;   
     $recArray[$no]['child'] = reccall($row->id); 
     ++$no; 
    } 
    return $recArray;  
} 
1
<? 
// I identified this function separately because it is performed only once, for preparing data 
// It's collect an array of all parents in the correct order for each id 
function dest($array) { 
    foreach($array as $key=>$value) { 
     if($value['pid']==0) continue; 

     $pid = $key; 
     $array[$key]['dest'] = array(); 
     while ($pid = $array[$pid]['pid']) { 
      if($key == $pid) exit("this tree is broken"); 
      $array[$key]['dest'][] = $pid; 
     } 
    } 

    return $array; 
} 
// Recursive function that puts the items in the correct tree. removes the parameter dest. 
function tree($array) { 
    foreach($array as $key=>$value) { 
     if(is_array($value['dest']) && !empty($value['dest'])) { 
      $pid = array_pop($value['dest']); 
      if(empty($value['dest'])) unset($value['dest']); 

      $array[$pid]['childrens'][$key] = $value; 
      $array[$pid]['childrens'] = tree($array[$pid]['childrens']); 
      unset($array[$key]); 
     } 
    } 

    return $array; 
} 

$array = array(
    1 => array(
     'title'=>'q', 
     'pid'=>0, 
     ), 
    2 => array(
     'title'=>'w', 
     'pid'=>1, 
     ), 
    3 => array(
     'title'=>'e', 
     'pid'=>0, 
     ), 
    4 => array(
     'title'=>'r', 
     'pid'=>2, 
     ), 
    5 => array(
     'title'=>'t', 
     'pid'=>1, 
     ), 
); 

$tree = tree(dest($array)); 

echo '<pre>'; 
print_r($array); 
print_r($tree); 
?> 

그러나이 배열은별로 유용하지 않습니다. 함수 dest()의 결과를 사용하는 것이 더 좋습니다.