php - 转换类数组
问题描述
我需要转换这个类数组
$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 可以是无限层级,所以不知道会有多少层级。我了解,需要递归,但我不知道如何将其转换为。
我需要这个,因为我正在做类别树并且我正在尝试制作一个表格,以添加类别(通过输入名称并选择父级)。
如果有任何方法可以将类别添加到我的第二个示例中,这将对我有很大帮助。
解决方案
显然你有一个这样的类(我在这里省略了私有成员声明):
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
是一个简单的(对象)数组。
推荐阅读
- python - 线程超类 - args
- xml - XSLT 结合多个父母
- sql - SQL Server Query 等效于 excel 公式
- linux - 在 Ubuntu 20.04 上安装 codelite 时出错 - 无法启动连接
- node.js - 将 GIF 的所有帧显示为单个图像
- c++ - 如何在从抽象基派生的类中实现相同的方法?
- c# - 如何获得 HttpClient POST 请求中使用的协商 TLS 版本
- javascript - 获取错误 .map() 不是函数
- javascript - cal 热图 web 布局
- c# - ConfirmEmail Action 方法返回 404