【问题标题】:How to convert a flat array to hierarchical tree array? [closed]如何将平面数组转换为分层树数组? [关闭]
【发布时间】:2014-02-19 14:17:59
【问题描述】:

我想知道如何编写将任意大小的平面数组转换为分层树的方法(查看示例)。谁能建议一种方法来做到这一点?另外,这是否可以在不使用大量资源的情况下完成?

这是我的例子:

平面阵列:

$categories = array(
    array(
        'id' => 1,
        'sub' => 0
    ),
    array(
        'id' => 2,
        'sub' => 1
    ),
    array(
        'id' => 3,
        'sub' => 1
    ),
    array(
        'id' => 4,
        'sub' => 2
    ),
    array(
        'id' => 5,
        'sub' => 2
    ),
    array(
        'id' => 6,
        'sub' => 4
    ),
    array(
        'id' => 7,
        'sub' => 0
    )
);

层次树:

$categories = array(
    array(
        'id' => 1,
        'sub' => 0,
        'children' => array(
            array(
                'id' => 2,
                'sub' => 1,
                'children' => array(
                    array(
                        'id' => 4,
                        'sub' => 2,
                        'children' => array(
                            array(
                                'id' => 6,
                                'sub' => 4,
                                'children' => array()
                            )
                        )
                    ),
                    array(
                        'id' => 5,
                        'sub' => 2,
                        'children' => array()
                    )
                )
            ),
            array(
                'id' => 3,
                'sub' => 1,
                'children' => array()
            ),
        )
    ),
    array(
        'id' => 7,
        'sub' => 0,
                'children' => array()
    )
);

【问题讨论】:

标签: php arrays


【解决方案1】:

我提出了面向对象的方法

一个。表示节点的简单类,具有 addChild 和将 self 转换为数组的方法:

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
                         )
                );
        }
}

b.从平面 $categories 数组创建 TreeNodes 平面数组,并确定树的根

$nodes = array();
$rootNodes = array();
foreach($categories as $category) {
        $nodes[$category['id']] = new TreeNode($category);
        if ($category['sub'] == 0) {
                $rootNodes[] = $nodes[$category['id']];
        }
}

c。将子节点添加到 TreeNodes

array_map(
  function(TreeNode $element) use($nodes){ 
    if(isset($nodes[$element->parent])) 
      $nodes[$element->parent]->addChild($element);
  }, $nodes
);

d。从根开始将树转换为数组

print_r(array_map(
  function(TreeNode $element) { 
    return $element->toArray();
  }, $rootNodes)
);

【讨论】:

  • 谢谢伙计。但是,你能知道如何处理类别,它是这样创建的: foreach ($categories as $c) { $cats[] = array( 'name' => $c->name, 'count' => $ c->count, 'id' => $c->id, 'description' => $c->description, 'sub' => $c->sub, 'products' => $c->products, ' status' => $c->status, 'level' => $level );因为这是一个例子。
  • 您可以将 $c 包装在 TreeNode 中而不是示例数组中,并在 toArray 方法中从 $this->c 对象生成最终数组
  • 并删除 __construct、toArray() 和点 D?我的解决方案是在 C 点?需要以数据的形式出现。
  • 在点 a。函数 __construct($c) { $this->id = $c->id; $this->parent = $c->sub; $this->c = $c; $this->children = array();}/// function toArray() { $c = $this->c; return array('name' => $c->name, 'count' => $c->count, 'id' => $c->id, 'description' => $c->description, 'sub' => $c->sub, 'products' => $c->products, 'status' => $c->status, 'level' => $level, 'children' => ...[无改动] ); }点b。而是数组 $category 你使用 $c 对象点 c。没有变化点d。没有变化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多