#php #массивы #ооп
Итак. Есть массив с объектами $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 Дети => ( Имя объекта3 Имя объекта => Имя объекта3 Дети => () Имя объекта4 Имя объекта => Имя объекта4 Дети => ( Имя объекта2 Имя объекта => Имя объекта2 Дети => () ) ) )
Ответы
Ответ 1
ООП вариант: 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) );Ответ 2
Если массив с объектами создавали не мы, то для удобства обработки его следует дополнить списком дочерних элементов. И при выводе результата использовать print_r() вместо var_dump(). Программа: $arr = [ (object)["name"=>"Имя объекта1","nameP"=> ""], (object)["name"=>"Имя объекта2","nameP"=> "Имя объекта4"], (object)["name"=>"Имя объекта3","nameP"=> "Имя объекта1"], (object)["name"=>"Имя объекта4","nameP"=> "Имя объекта1"] ]; function children(&$arr){ $arr2 = $arr; foreach($arr as $key=>&$item){ if($item->nameP == ""){ $root = $key; } $item->children = []; foreach($arr2 as $key2=>$item2){ if($item2->nameP == $item->name){ array_push($item->children, $key2); } } } return $root; }; function get_struct($arr, $index){ $node = $arr[$index]; struct == []; $struct[$node->name] = [ "Имя объекта" => $node->name, "Дети" => [] ]; foreach($node->children as $child){ $struct[$node->name]["Дети"][$arr[$child]->name] = get_struct($arr, $child); } return $struct; } var_dump($arr); $root = children($arr); var_dump($arr); $struct = get_struct($arr, $root); print(""); print_r($struct); print(""); Результаты: array (size=4) 0 => object(stdClass)[1] public 'name' => string 'Имя объекта1' (length=22) public 'nameP' => string '' (length=0) 1 => object(stdClass)[2] public 'name' => string 'Имя объекта2' (length=22) public 'nameP' => string 'Имя объекта4' (length=22) 2 => object(stdClass)[3] public 'name' => string 'Имя объекта3' (length=22) public 'nameP' => string 'Имя объекта1' (length=22) 3 => object(stdClass)[4] public 'name' => string 'Имя объекта4' (length=22) public 'nameP' => string 'Имя объекта1' (length=22) array (size=4) 0 => object(stdClass)[1] public 'name' => string 'Имя объекта1' (length=22) public 'nameP' => string '' (length=0) public 'children' => array (size=2) 0 => int 2 1 => int 3 1 => object(stdClass)[2] public 'name' => string 'Имя объекта2' (length=22) public 'nameP' => string 'Имя объекта4' (length=22) public 'children' => array (size=0) empty 2 => object(stdClass)[3] public 'name' => string 'Имя объекта3' (length=22) public 'nameP' => string 'Имя объекта1' (length=22) public 'children' => array (size=0) empty 3 => object(stdClass)[4] public 'name' => string 'Имя объекта4' (length=22) public 'nameP' => string 'Имя объекта1' (length=22) public 'children' => array (size=1) 0 => int 1 Array ( [Имя объекта1] => Array ( [Имя объекта] => Имя объекта1 [Дети] => Array ( [Имя объекта3] => Array ( [Имя объекта3] => Array ( [Имя объекта] => Имя объекта3 [Дети] => Array ( ) ) ) [Имя объекта4] => Array ( [Имя объекта4] => Array ( [Имя объекта] => Имя объекта4 [Дети] => Array ( [Имя объекта2] => Array ( [Имя объекта2] => Array ( [Имя объекта] => Имя объекта2 [Дети] => Array ( ) ) ) ) ) ) ) ) )
Комментариев нет:
Отправить комментарий