Построение дерева иерархии с помощью PHP / MySQL
Идея отсюда http://forum.vingrad.ru/articles/topic-147526/anchor-entry1188785/0.htmlДовольно часто возникает потребность построения дерева иерархии с таблицы со структурой id | parentId | value
Для сравнительно небольшого дерева наиболее эффективным открыл для себя способ, предложенный пользователем под ником SelenIT
Итак, есть у нас таблица tree со структурой
id | pid | value
где id - первичный ключ строки
pid - id родителя
Соединяемся с базой
$hostName = '';
$userName = '';
$password = '';
$databaseName = 'test';
if (!($link=mysql_connect($hostName,$userName,$password)))
{
printf('Connecting MySQL error!');
exit();
}
if (!mysql_select_db($databaseName, $link))
{
printf('Database error!');
exit();
}
Выполняем запрос и получаем данные
$sql='SELECT `id`, `pid`, `value`
FROM `tree`
ORDER BY `pid`';
$tree = array();
$result=mysql_query($sql, $link);
while ($row = mysql_fetch_assoc($result))
{
$tree[$row['pid']][] = $row;
}
mysql_close($link);
Запросом мы выбрали все данные с таблицы и отсортировали по родителю, потом сформировали массив, каждый элемент которого - массив записей с одним и тем же родителем.
Функция ниже приводит полученный выше массив к виду
array(
'id' => 1,
'pid' => 0,
'children' => array(
'id' => 2,
'pid' => 1.
'children' => array ...
)
)
function formTree($pid=0)
{
$data=array();
global $tree;
if (!isset($tree[$pid])) return;
foreach($tree[$pid] as $item)
{
$data[$item['id']]=array(
'id'=>$item['id'],
'value'=>$item['value']
);
$children=formTree($item['id']);
if(!empty($children))
{
$data[$item['id']]['children']=$children;
}
}
return $data;
}
И выводим данные
print_r(formTree());
Все!
?>