Я использую следующее:
<?php
// Получение сплошного списка
function get_cat()
{
global $pdo;
$cat_arr = [];
try
{
$query = "SELECT ID, PID, NAME FROM `catalog` WHERE 1";
$stmt = $pdo->prepare( $query );
$stmt->execute();
}
catch (PDOException $e)
{
die("Error in :".__FILE__." file, at ".__LINE__." line. Can't get data : " . $e->getMessage());
}
while( $row = $stmt->fetch(PDO::FETCH_ASSOC ) )
$cat_arr[$row['ID']] = $row;
return $cat_arr;
}
// Построение дерева
function tree_map( $dataset )
{
$tree = [];
foreach ($dataset as $id=>&$node)
if (!$node['PID'])
$tree[$id] = &$node;
else
$dataset[$node['PID']]['childs'][$id] = &$node;
return $tree;
}
$dataset = get_cat();
$dataset = tree_map( $dataset );
Используется PDO, но это неважно. В результирующем массиве имеем дерево со связями child-PID.
Для удобной визуализации данных использую:
<?php
function debug( $arr )
{
$str = print_r($arr, true);
echo '<pre>'.$str.'</pre>';
}