Tree structure management tool that allows easy operations such as adding, modifying, deleting, searching, serializing, and deserializing nodes in a hierarchical structure.

v1.0.14 2024-01-17 08:11 UTC

This package is auto-updated.

Last update: 2024-04-17 08:45:29 UTC


README

Tree structure management tool that allows easy operations such as adding, modifying, deleting, searching, serializing, and deserializing nodes in a hierarchical structure.

Installation

You can install the package via composer:

composer require coco-project/tree

For more examples, please refer to the "examples","tests/Unit/TreeTest.php"

Here's a quick example:

<?php

    use Coco\tree\DataSource;
    use Coco\tree\TreeNode;

    require '../vendor/autoload.php';

    $datas = [
        [
            'id'     => 1,
            'parent' => 0,
            'title'  => 'Node 1-0',
            'data'   => 'data 1-0',
            'order'  => 18,
        ],
        [
            'id'     => 2,
            'parent' => 1,
            'title'  => 'Node 2-1',
            'data'   => 'data 2-1',
            'order'  => 13,
        ],
        [
            'id'     => 3,
            'parent' => 0,
            'title'  => 'Node 3-3',
            'data'   => 'data 3-3',
            'order'  => 17,
        ],
        [
            'id'     => 4,
            'parent' => 1,
            'title'  => 'Node 4-1',
            'data'   => 'data 4-1',
            'order'  => 11,
        ],
        [
            'id'     => 5,
            'parent' => 2,
            'title'  => 'Node 5-2',
            'data'   => 'data 5-2',
            'order'  => 15,
        ],
        [
            'id'     => 6,
            'parent' => 3,
            'title'  => 'Node 6-3',
            'data'   => 'data 6-3',
            'order'  => 14,
        ],
        [
            'id'     => 7,
            'parent' => 2,
            'title'  => 'Node 7-5',
            'data'   => 'data 7-5',
            'order'  => 16,
        ],
        [
            'id'     => 8,
            'parent' => 1,
            'title'  => 'Node 8-2',
            'data'   => 'data 8-2',
            'order'  => 12,
        ],
        [
            'id'     => 9,
            'parent' => 3,
            'title'  => 'Node 9-3',
            'data'   => 'data 9-3',
            'order'  => 10,
        ],
    ];

    $source = new DataSource($datas);
    $source->setIdField('id');
    $source->setParentField('parent');
    $source->setRootId(0);

    $source->setDataFields('id');
    $source->setDataFields('title');
    $source->setDataFields('order');
    $source->setDataFields('data', function($item, $allData, $field) {
        return '<' . $item[$field] . '>';
    });

    $tree = $source->toTree();
    print_r($tree->toArrayAll());

/*

Array
(
    [id] => 0
    [level] => 0
    [parentId] => 
    [data] => Array
        (
        )

    [childs] => Array
        (
            [3] => Array
                (
                    [id] => 3
                    [level] => 1
                    [parentId] => 0
                    [data] => Array
                        (
                            [id] => 3
                            [title] => Node 3-3
                            [order] => 17
                            [data] => <data 3-3>
                        )

                    [childs] => Array
                        (
                            [9] => Array
                                (
                                    [id] => 9
                                    [level] => 2
                                    [parentId] => 3
                                    [data] => Array
                                        (
                                            [id] => 9
                                            [title] => Node 9-3
                                            [order] => 10
                                            [data] => <data 9-3>
                                        )

                                    [childs] => Array
                                        (
                                        )

                                )

                            [6] => Array
                                (
                                    [id] => 6
                                    [level] => 2
                                    [parentId] => 3
                                    [data] => Array
                                        (
                                            [id] => 6
                                            [title] => Node 6-3
                                            [order] => 14
                                            [data] => <data 6-3>
                                        )

                                    [childs] => Array
                                        (
                                        )

                                )

                        )

                )

            [1] => Array
                (
                    [id] => 1
                    [level] => 1
                    [parentId] => 0
                    [data] => Array
                        (
                            [id] => 1
                            [title] => Node 1-0
                            [order] => 18
                            [data] => <data 1-0>
                        )

                    [childs] => Array
                        (
                            [8] => Array
                                (
                                    [id] => 8
                                    [level] => 2
                                    [parentId] => 1
                                    [data] => Array
                                        (
                                            [id] => 8
                                            [title] => Node 8-2
                                            [order] => 12
                                            [data] => <data 8-2>
                                        )

                                    [childs] => Array
                                        (
                                        )

                                )

                            [4] => Array
                                (
                                    [id] => 4
                                    [level] => 2
                                    [parentId] => 1
                                    [data] => Array
                                        (
                                            [id] => 4
                                            [title] => Node 4-1
                                            [order] => 11
                                            [data] => <data 4-1>
                                        )

                                    [childs] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [id] => 2
                                    [level] => 2
                                    [parentId] => 1
                                    [data] => Array
                                        (
                                            [id] => 2
                                            [title] => Node 2-1
                                            [order] => 13
                                            [data] => <data 2-1>
                                        )

                                    [childs] => Array
                                        (
                                            [7] => Array
                                                (
                                                    [id] => 7
                                                    [level] => 3
                                                    [parentId] => 2
                                                    [data] => Array
                                                        (
                                                            [id] => 7
                                                            [title] => Node 7-5
                                                            [order] => 16
                                                            [data] => <data 7-5>
                                                        )

                                                    [childs] => Array
                                                        (
                                                        )

                                                )

                                            [5] => Array
                                                (
                                                    [id] => 5
                                                    [level] => 3
                                                    [parentId] => 2
                                                    [data] => Array
                                                        (
                                                            [id] => 5
                                                            [title] => Node 5-2
                                                            [order] => 15
                                                            [data] => <data 5-2>
                                                        )

                                                    [childs] => Array
                                                        (
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

 */
<?php

    use Coco\tree\Tree;
    use Coco\tree\TreeNode;

    require '../vendor/autoload.php';

    $datas = [
        [
            'id'     => 1,
            'parent' => 0,
            'title'  => 'Node 1-0',
            'data'   => 'data 1-0',
            'order'  => 18,
        ],
        [
            'id'     => 2,
            'parent' => 1,
            'title'  => 'Node 2-1',
            'data'   => 'data 2-1',
            'order'  => 13,
        ],
        [
            'id'     => 3,
            'parent' => 0,
            'title'  => 'Node 3-3',
            'data'   => 'data 3-3',
            'order'  => 17,
        ],
        [
            'id'     => 4,
            'parent' => 1,
            'title'  => 'Node 4-1',
            'data'   => 'data 4-1',
            'order'  => 11,
        ],
        [
            'id'     => 5,
            'parent' => 2,
            'title'  => 'Node 5-2',
            'data'   => 'data 5-2',
            'order'  => 15,
        ],
        [
            'id'     => 6,
            'parent' => 3,
            'title'  => 'Node 6-3',
            'data'   => 'data 6-3',
            'order'  => 14,
        ],
        [
            'id'     => 7,
            'parent' => 2,
            'title'  => 'Node 7-5',
            'data'   => 'data 7-5',
            'order'  => 16,
        ],
        [
            'id'     => 8,
            'parent' => 1,
            'title'  => 'Node 8-2',
            'data'   => 'data 8-2',
            'order'  => 12,
        ],
        [
            'id'     => 9,
            'parent' => 3,
            'title'  => 'Node 9-3',
            'data'   => 'data 9-3',
            'order'  => 10,
        ],
    ];

    $source = new \Coco\tree\DataSource($datas);
    $source->setIdField('id');
    $source->setParentField('parent');
    $source->setRootId(0);

    $source->setDataFields('id');
    $source->setDataFields('parent');
    $source->setDataFields('title');
    $source->setDataFields('order');
    $source->setDataFields('data', function($item, $allData, $field) {
        return implode('', [
            '<',
            $item[$field],
            '>',
        ]);
    });

    $tree = $source->toTree();

    $res = Tree::transformer($tree, function(TreeNode $treeNode) {
        return [
            'id_'       => $treeNode->getId(),
            'level_'    => $treeNode->getLevel(),
            'parentId_' => $treeNode->getParentNode()?->getId(),
            'data_'     => $treeNode->getData(),
            "subFields"      => [
                'order_'  => $treeNode['order'],
                'childs_' => [
                    "son" => '__CHILDS_FIELD__',
                ],
            ],
        ];
    });

    print_r(json_encode($res));

    /*
{
	"id_"       : 0,
	"level_"    : 0,
	"parentId_" : null,
	"data_"     : [],
	"subFields" : {
		"order_"  : null,
		"childs_" : {
			"son" : [
				{
					"id_"       : 3,
					"level_"    : 1,
					"parentId_" : 0,
					"data_"     : {
						"id"     : 3,
						"parent" : 0,
						"title"  : "Node 3-3",
						"order"  : 17,
						"data"   : "<data 3-3>"
					},
					"subFields" : {
						"order_"  : 17,
						"childs_" : {
							"son" : [
								{
									"id_"       : 9,
									"level_"    : 2,
									"parentId_" : 3,
									"data_"     : {
										"id"     : 9,
										"parent" : 3,
										"title"  : "Node 9-3",
										"order"  : 10,
										"data"   : "<data 9-3>"
									},
									"subFields" : {
										"order_"  : 10,
										"childs_" : {
											"son" : []
										}
									}
								},
								{
									"id_"       : 6,
									"level_"    : 2,
									"parentId_" : 3,
									"data_"     : {
										"id"     : 6,
										"parent" : 3,
										"title"  : "Node 6-3",
										"order"  : 14,
										"data"   : "<data 6-3>"
									},
									"subFields" : {
										"order_"  : 14,
										"childs_" : {
											"son" : []
										}
									}
								}
							]
						}
					}
				},
				{
					"id_"       : 1,
					"level_"    : 1,
					"parentId_" : 0,
					"data_"     : {
						"id"     : 1,
						"parent" : 0,
						"title"  : "Node 1-0",
						"order"  : 18,
						"data"   : "<data 1-0>"
					},
					"subFields" : {
						"order_"  : 18,
						"childs_" : {
							"son" : [
								{
									"id_"       : 8,
									"level_"    : 2,
									"parentId_" : 1,
									"data_"     : {
										"id"     : 8,
										"parent" : 1,
										"title"  : "Node 8-2",
										"order"  : 12,
										"data"   : "<data 8-2>"
									},
									"subFields" : {
										"order_"  : 12,
										"childs_" : {
											"son" : []
										}
									}
								},
								{
									"id_"       : 4,
									"level_"    : 2,
									"parentId_" : 1,
									"data_"     : {
										"id"     : 4,
										"parent" : 1,
										"title"  : "Node 4-1",
										"order"  : 11,
										"data"   : "<data 4-1>"
									},
									"subFields" : {
										"order_"  : 11,
										"childs_" : {
											"son" : []
										}
									}
								},
								{
									"id_"       : 2,
									"level_"    : 2,
									"parentId_" : 1,
									"data_"     : {
										"id"     : 2,
										"parent" : 1,
										"title"  : "Node 2-1",
										"order"  : 13,
										"data"   : "<data 2-1>"
									},
									"subFields" : {
										"order_"  : 13,
										"childs_" : {
											"son" : [
												{
													"id_"       : 7,
													"level_"    : 3,
													"parentId_" : 2,
													"data_"     : {
														"id"     : 7,
														"parent" : 2,
														"title"  : "Node 7-5",
														"order"  : 16,
														"data"   : "<data 7-5>"
													},
													"subFields" : {
														"order_"  : 16,
														"childs_" : {
															"son" : []
														}
													}
												},
												{
													"id_"       : 5,
													"level_"    : 3,
													"parentId_" : 2,
													"data_"     : {
														"id"     : 5,
														"parent" : 2,
														"title"  : "Node 5-2",
														"order"  : 15,
														"data"   : "<data 5-2>"
													},
													"subFields" : {
														"order_"  : 15,
														"childs_" : {
															"son" : []
														}
													}
												}
											]
										}
									}
								}
							]
						}
					}
				}
			]
		}
	}
}

     */

Testing

composer test

License

MIT