2012-05-24 2 views
0

У меня есть таблицаСоздание структурированного массива с помощью рекурсивной функции

enter image description here

который я хочу показать рекурсивно, как показано на рисунке ниже

enter image description here

Я использую рекурсивную функцию в PHP

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 /) by 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). Вместо этого вы должны узнать о [подготовленных утверждениях] (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().

Смежные вопросы