riff
Новичок
Загрузка данных из БД ввиде дерева.
Оцените, пожалуйста, код (Загрузка данных из БД ввиде дерева.). Не очень строго, т.к. учусь.
Оцените, пожалуйста, код (Загрузка данных из БД ввиде дерева.). Не очень строго, т.к. учусь.
PHP:
<?php
/**
* PHP 4.4.4
*
* БД
* -----
* ID - Идентификатор ветки
* PID - Родительский ID (если pid=0 значит это самая первая ветка)
* FIELD1, FIELD2,... - Поля таблицы
* -----
*
* @return array
*/
function &make_tree()
{
$tree = array();
$query = mysql_query('select * from `my_table` order by `field2`');
if (! $query) return $tree;
$nodes = array();
$keys = array();
while (($node = mysql_fetch_assoc($query)))
{
//if ($node['childs'] === '1') //если есть поле определяющее наличие дочерних веток
// $node['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе
$nodes[$node['id']] =& $node; //заполняем список веток записями из БД
$keys[] = $node['id']; //заполняем список ключей(ID)
unset($node);
}
mysql_free_result($query);
foreach ($keys as $key)
{
/**
* если нашли главную ветку(или одну из главных), то добавляем
* её в дерево
*/
if ($nodes[$key]['pid'] === '0')
$tree[] =& $nodes[$key];
/**
* else находим родительскую ветку и добавляем текущую
* ветку к дочерним элементам родит.ветки.
*/
else
{
if (isset($nodes[ $nodes[$key]['pid'] ])) //на всякий случай, вдруг в базе есть потерянные ветки
{
if (! isset($nodes[ $nodes[$key]['pid'] ]['nodes'])) //если нет поля определяющего наличие дочерних веток
$nodes[ $nodes[$key]['pid'] ]['nodes'] = array(); //то добавляем к записи узел (массив дочерних веток) на данном этапе
$nodes[ $nodes[$key]['pid'] ]['nodes'][] =& $nodes[$key];
}
}
}
return $tree;
}
$tree =& make_tree();
print_r($tree);
?>