Displaying Tree Info

post_id: 54 / post_date: 2011-06-11



[tab: Statement]

given an item which has a parent of itself, its possible to make this into a hierarchical object format and diplay it using a combination of ul / li.

I've developed this in both C# and cakephp (See overleaf), and now in 2015 using Yii (without the Set class).

[tab: C#]

Given a parentid, a flat List<T> can be loaded hierarchically using FindAll / ForEach and AddRange.

Displaying can be done with a combination of ul / li calling a recursive function.

//Flat list to deep one.
var list = GetFlatItems();
foreach (var item in list)
{
  var children = list.FindAll(x => x.Parent == item.Id);
  children.ForEach(x => x.Parent = item);
  item.Children.AddRange(children);
}
roots = list.FindAll(x => x.Children.Count > 0 && x.Parent == null);

//roots is now Top-level parent items
//In the page, just add a ul like so:
//    <ul id="ItemsCtl" runat="server" />
foreach (var item in roots)
{
  AddItem(item, ItemsCtl);
}

private void AddItem(Info item, HtmlGenericControl parent)
{
  var info = new Literal { Text = item.Name };
  var div = new HtmlGenericControl("li") { ID = "d" };
  div.Controls.Add(img); div.Controls.Add(info);
  parent.Controls.Add(div);
  if (item.Children.Count > 0)
  {
    var ul = new HtmlGenericControl("ul") { ID = "u" };
    parent.Controls.Add(ul);
    foreach (var e in item.Children) AddItem(e, ul);
  }
}

[tab: php]
Developed in Cakephp, Set is a library used for manipulation of arrays. Data can be seen overleaf.

//Controller
$res = $this->Item->find('all');
$res = Set::combine($res, '{n}.Item.id', '{n}.Item.name', '{n}.Skill.parent_id');
$this->set('items', $res);

//View (inside a ul tag).
foreach ($items[0] as $key=>$itm) show($items, $key, $itm);
function show($a, $ky, $itm)
{
  echo "<li>" . $itm . "</li>";
  if (array_key_exists($ky, $a))
  {
    echo "<ul>";
    foreach ($a[$ky] as $key=>$itm) show($a, $key, $itm);
    echo "</ul>";
  }
}

[tab: php data]
Categories and subcategories of topics. array[1] is the children of item 1 which is a root item (parent 0)

Array
(
    [0] => Array
        (
            [1] => .net
            [7] => java
        )

    [1] => Array
        (
            [2] => ado.net
            [3] => generics
            [4] => asp.net
            [5] => silverlight
            [6] => authentication
        )

)