A PHP class to build parent child arrays from a flat array or database query results.
I am currently developing using Kohana 3.2 PHP Framework incorporating Mustache Templates and the Twitter Bootstrap with LESS CSS and loving it. I recently wrote this simple php class to convert a flat array with id and parent_id keys into a multi-dimensional array where parents have a `children` key with children in a sub-array.
class BuildParentChild { private $data = array(); public $rendered; public function __construct(&$Input) { foreach($Input as $Item) { $Item= (array) $Item; $this->data['items'][$Item['id']] = $Item; $this->data['parents'][$Item['parent_id']][] = $Item['id']; if(!isset($this->top_level) || $this->top_level > $Item['parent_id']) { $this->top_level = $Item['parent_id']; } } return $this; } public function build($id) { $return{$id} = array(); foreach($this->data['parents'][$id] as $child) { $build = $this->data['items'][$child]; if(isset($this->data['parents'][$child])) { $build['has_children'] = true; $build['children'] = $this->build($child); } else { $build['has_children'] = false; } $return{$id}[] = $build; } return (array) $return{$id}; } public function render() { if(!isset($this->rendered) || !is_array($this->rendered)) { $this->rendered = $this->build($this->top_level); } return $this->rendered; } } $Menu = new BuildParentChild($menu_items); var_dump($Menu->render());
Consider the following table
id | parent_id | Name |
---|---|---|
1 | 0 | Top |
2 | 1 | Second Level |
3 | 2 | Third Level |
4 | 1 | Another Second Level |
5 | 0 | Another Top Level |
Would generate the following result.
array( 'id' => 1, 'name' => top, 'has_children' => true, 'children' => array( array( 'id' => 2, 'name' => Second Level, 'has_children' => true,
Perfect !! A minor mod and working in 5 minutes – thank you !!!
Thanks for the snippet! how would the mustache markup looking like when using as menu with ul and li? im fiddeling now a while withe your code without any success :/
thanks anyway for sharing
Output menu
Menu Partial