Во-первых, новый массив, в котором ключи отображаются как идентификаторы.Затем в этот массив строится граф.И это происходит рекурсивный график.(извините за мой английский)
<?php
function change_index_to_id($array) {
$result = array();
foreach ($array as $value) {
$result[$value['id']] = $value;
}
return $result;
}
function make_graph($data) {
$graph = array();
foreach ($data as $id => $value) {
if (!is_null($value['parent'])) {
$graph[$value['parent']][$id] = true;
} else {
$graph[$id] = array();
}
}
return $graph;
}
function make_hierarchical_array($item_id, $graph, $data, $marked_items) {
$result = $data[$item_id];
$marked_items[$item_id] = true;
foreach ($graph[$item_id] as $id => $v) {
if (isset($graph[$id]) && ! $marked_items[$id]) {
$result['childrens'][$id] = make_hierarchical_array($id, $graph, $data, &$marked_items);
} else {
$result['childrens'][$id] = $data[$id];
}
}
return $result;
}
// load data from database or other
$data = array(
array(
'id' => 1,
'parent' => null,
'title' => 'yek'
),
array(
'id' => 2,
'parent' => null,
'title' => 'do'
),
array(
'id' => 3,
'parent' => 1,
'title' => 'se'
),
array(
'id' => 4,
'parent' => 3,
'title' => 'char'
),
);
$data = change_index_to_id($data);
$graph = make_graph($data);
$result = array();
$marked_items = array();
foreach ($graph as $id => $childs) {
if ($marked_items[$id] == false) {
$result[$id] = make_hierarchical_array($id, $graph, $data, &$marked_items);
}
}
print_r($result);
?>