首页 > 解决方案 > 转换类数组

问题描述

我需要转换这个类数组

$categoriesArray = array();
//                                    ID, PARENT_ID, NAME
$categoriesArray[] = Category::create(1,   0,       "Category A");
$categoriesArray[] = Category::create(2,   0,       "Category B");
$categoriesArray[] = Category::create(3,   0,       "Category C");
$categoriesArray[] = Category::create(4,   2,       "Sub-cat F");
$categoriesArray[] = Category::create(5,   2,       "Sub-Cat G");
$categoriesArray[] = Category::create(6,   3,       "Sub-Cat H");

进入这个:

$x = new CategoryTree("Main");
$x->add_sub_cat(new CategoryTree($categoriesArray[0]->name));                           //Category A
$x->add_sub_cat(new CategoryTree($categoriesArray[1]->name));                           //Category B
$x->add_sub_cat(new CategoryTree($categoriesArray[2]->name));                           //Category C
$x->subCats[1]->add_sub_cat(new CategoryTree($categoriesArray[3]->name));               //Sub-Cat F
$x->subCats[1]->add_sub_cat(new CategoryTree($categoriesArray[4]->name));               //Sub-Cat G
$x->subCats[2]->add_sub_cat(new CategoryTree($categoriesArray[5]->name));               //Sub-Cat H

subCats 可以是无限层级,所以不知道会有多少层级。我了解,需要递归,但我不知道如何将其转换为。

我需要这个,因为我正在做类别树并且我正在尝试制作一个表格,以添加类别(通过输入名称并选择父级)。

如果有任何方法可以将类别添加到我的第二个示例中,这将对我有很大帮助。

标签: php

解决方案


显然你有一个这样的类(我在这里省略了私有成员声明):

class Category {
        static function create($id, $parentId, $name) {
                $category = new Category();
                $category->id = $id;
                $category->parentId = $parentId;
                $category->name = $name;
                return $category;
        }
        function add_sub_cat($cat) {
                $cat->parentId = $this;
        }
}

这适用于您发布的代码:

$categoriesArray = [];
$categoriesArray[] = Category::create(1,   0,       "Category A");
$categoriesArray[] = Category::create(2,   0,       "Category B");
$categoriesArray[] = Category::create(3,   0,       "Category C");
$categoriesArray[] = Category::create(4,   2,       "Sub-cat F");
$categoriesArray[] = Category::create(5,   2,       "Sub-Cat G");
$categoriesArray[] = Category::create(6,   3,       "Sub-Cat H");

而且您似乎有一个类似于此的类别树类:

class CategoryTree {
    function __construct($name) {
        $this->name = $name;
    }
    function add_sub_cat($catTree) {
        $this->subCats[] = $catTree;
    }
}

再次您发布的代码:

$x = new CategoryTree("Main");
$x->add_sub_cat(new CategoryTree($categoriesArray[0]->name));                           //Category A
$x->add_sub_cat(new CategoryTree($categoriesArray[1]->name));                           //Category B
$x->add_sub_cat(new CategoryTree($categoriesArray[2]->name));                           //Category C
$x->subCats[1]->add_sub_cat(new CategoryTree($categoriesArray[3]->name));               //Sub-Cat F
$x->subCats[1]->add_sub_cat(new CategoryTree($categoriesArray[4]->name));               //Sub-Cat G
$x->subCats[2]->add_sub_cat(new CategoryTree($categoriesArray[5]->name));               //Sub-Cat H

你得到这个:

object(CategoryTree)#7 (2) {
  ["name"]=>
  string(4) "Main"
  ["subCats"]=>
  array(3) {
    [0]=>
    object(CategoryTree)#8 (1) {
      ["name"]=>
      string(10) "Category A"
    }
    [1]=>
    object(CategoryTree)#9 (2) {
      ["name"]=>
      string(10) "Category B"
      ["subCats"]=>
      array(2) {
        [0]=>
        object(CategoryTree)#11 (1) {
          ["name"]=>
          string(9) "Sub-cat F"
        }
        [1]=>
        object(CategoryTree)#12 (1) {
          ["name"]=>
          string(9) "Sub-Cat G"
        }
      }
    }
    [2]=>
    object(CategoryTree)#10 (2) {
      ["name"]=>
      string(10) "Category C"
      ["subCats"]=>
      array(1) {
        [0]=>
        object(CategoryTree)#13 (1) {
          ["name"]=>
          string(9) "Sub-Cat H"
        }
      }
    }
  }
}

后面的代码可以替换为动态执行的代码:

// You need to make sure the array defines all parent categories first before
// sub categories can refer to them. This might already be the case, but we
// make that sure by sorting by parentId.
usort($categoriesArray, function($c1, $c2) { return $c1->parentId-$c2->parentId; });
// The trick is to build up a (flat) registry where you can simply add children
$x = new CategoryTree("Main");
$registry = [0 => $x]; // One entry: Main (parentId = 0)
foreach ($categoriesArray as $c) {
    $catTree = new CategoryTree($c->name);
    $registry[$c->id] = $catTree;
    $registry[$c->parentId]->add_sub_cat($catTree);
}

顺便说一句:你没有一个类数组,categoriesArray是一个简单的(对象)数组。


推荐阅读