Итак. Есть массив с объектами
$arr = array(
(object)array("name"=>"Имя объекта1", "nameP"=> "" ),
(object)array("name"=>"Имя объекта2", "nameP"=> "Имя объекта4" ),
(object)array("name"=>"Имя объекта3", "nameP"=> "Имя объекта1" ),
(object)array("name"=>"Имя объекта4", "nameP"=> "Имя объекта1" ),
);
где
name - имя объекта.
nameP - имя его родителя.
Нужно сделать так, что бы по этому массиву создало многомерный массив, в котором соблюдалась иерархия массивов:
Имя объекта1(
Имя объекта => Имя объекта1
Дети => (
Имя объекта3
Имя объекта => Имя объекта3
Дети => ()
Имя объекта4
Имя объекта => Имя объекта4
Дети => (
Имя объекта2
Имя объекта => Имя объекта2
Дети => ()
)
)
)
Ответ
ООП вариант:
1) Простой класс предоставляющий метод addChild и возможность конвертнуть себя в массив:
class TreeNode {
public $id;
public $parent;
private $children;
public function __construct($dataArray) {
$this->id = $dataArray['id'];
$this->parent = $dataArray['sub'];
$this->children = array();
}
public function addChild(TreeNode $node) {
$this->children[$node->id] = $node;
}
public function toArray() {
return array(
'id' => $this->id,
'sub' => $this->parent,
'children' => array_map(
function(TreeNode $element) {
return $element->toArray();
}, $this->children
)
);
}
}
2)создаем массив TreeNodes:
$nodes = array();
$rootNodes = array();
foreach($ar as $arr) {
$nodes[$ar['id']] = new TreeNode($ar);
if ($ar['sub'] == 0) {
$rootNodes[] = $nodes[$ar['id']];
}
}
3)добавление потомков в дерево:
array_map(
function(TreeNode $element) use($nodes){
if(isset($nodes[$element->parent]))
$nodes[$element->parent]->addChild($element);
}, $nodes
);
4) конвертирование дерева в массив:
print_r(array_map(
function(TreeNode $element) {
return $element->toArray();
}, $rootNodes)
);
Комментариев нет:
Отправить комментарий