Страницы

Поиск по вопросам

понедельник, 15 октября 2018 г.

Создание многомерного массива по множеству объектов

Итак. Есть массив с объектами
$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) );

Комментариев нет:

Отправить комментарий