Recently, I worked on a tree structure, several nodes, several and increasing levels, and the print () method. At first I thought it should be Composite, then I wrote some possible designs and codes:

$struc = new Node('name0', 'id0', 'desc0'); $node1 = new Node('node1', 'id1', 'desc1'); $node2 = new Node('node2', 'id2', 'desc2'); $node3 = new Node('node3', 'id3', 'desc3'); $leaf1 = new Leaf('leaf1', 'ld1', 'lesc1'); $leaf2 = new Leaf('leaf2', 'ld2', 'lesc2'); $leaf3 = new Leaf('leaf3', 'ld3', 'lesc3'); $leaf4 = new Leaf('leaf4', 'ld4', 'lesc4'); $struc.add($node1); $struc.add($node3); $node1.add($leaf1); $node1.add($leaf2); $node1.add($node2); $node2.add($leaf3); $node3.add($leaf4);
It looks good, I think and start coding, the print () method can follow the Iterator template later. But during coding, do I feel it is too complicated for these simple nodes? And I have to create a lot of specific classes (more than 50+ and increase). Then I stopped and thought in a simple way using an array:
-- Structure Class -- //To be more readable and clear, array here could be //divided to 3 arrays(root/nodes/leafs), then connect //in a similar way Composite does. $struc = array('name0', 'id0', 'desc0', 'children'=>array( array('node1', 'id1', 'desc1', 'children' => array( array('leaf1', 'ld1', 'lesc1'), array('leaf2', 'ld2', 'lesc2'), array('node2', 'id2', 'desc2', 'children'=>array(array('leaf3', 'ld3', 'lesc3')) ) ) ), array('node3', 'id3', 'desc3', 'children' => array(array('leaf4', 'ld4', 'lesc4')) ) ) ); function print($node = $this->struct) { ... if(isset($node['children'])) $this->print($node['children']); ... }
The two projects look very similar, now I'm a little confused, what is the value of the Composite pattern, have I missed something important from this template?