如何在php中实现多级类别递归功能?

时间:2016-02-10 16:31:33

标签: php recursion

我正在做像

这样的展示树结构
Level1    level2    level3 ..... level n
   1
   +------1_1
   |         +------1_1_1
   +------1_2
   2 

我的数据
$ data =

Array
(
    [0] => Array
        (
            [IDCategory] => 1
            [IDCategoryParent] => 4
            [Name] => Thị trường trong nước
            [Slug] => thi-truong-trong-nuoc
            [OrderCategory] => 1
            [Description] => Tin tức Thị trường trong nước
            [Status] => 1
        )

    [1] => Array
        (
            [IDCategory] => 3
            [IDCategoryParent] => 3
            [Name] => Thị trường quốc tế
            [Slug] => thi-truong-quoc-te
            [OrderCategory] => 2
            [Description] => Tin tức Thị trường quốc tế
            [Status] => 1
        )

    [2] => Array
        (
            [IDCategory] => 4
            [IDCategoryParent] => 4
            [Name] => Tin tức công ty
            [Slug] => tin-tuc-cong-ty
            [OrderCategory] => 3
            [Description] => Tin tức công ty Tràng An
            [Status] => 1
        )

    [3] => Array
        (
            [IDCategory] => 5
            [IDCategoryParent] => 1
            [Name] => Thực phẩm
            [Slug] => thuc-pham
            [OrderCategory] => 1
            [Description] => Tin tức thực phẩm
            [Status] => 1
        )

)

这就是我所做的功能。

 public function recursive($parentid = 1, $data = NULL, $char = '') {
        if (isset($data) && is_array($data)) {
            foreach ($data as $key => $item) {
                if ($item['IDCategoryParent'] == $parentid) {
                    $this->recursiveData[$item['IDCategory']] = $item['Name'];
                    $this->recursive($item['IDCategory'], $data, $char);
                    echo $item['IDCategory'];
                }
            }
        }
        return $this->recursiveData;
    }


public function category() {
        $category = new Category();
        $data = $category->selectByStatus(1); // select data from database.

        $recursiveData = $this->recursive(1, $data); // call function 
        return $recursiveData;
    }

但结果只返回1个值是 "ThựcPhẩm" 。我的意思是我的递归函数错误,我不知道为什么这是错误的。请帮帮我。

[更新]:现在我再次尝试使用此代码,但

  

致命错误:允许的内存大小为134217728字节耗尽(尝试过   分配65488字节)

1 个答案:

答案 0 :(得分:1)

问题是您的某些类别将IDCategoryParent设置为自己的IDCategory,这会导致问题。

我已将那些引用自己​​的IDCategory IDCategoryParent的内容更改为0。这意味着他们在level 1

请注意,我刚刚在示例代码中使用了一个简单的函数,但如果您愿意,可以将其转换为类方法。

$data = [
    [
        'IDCategory' => 1,
        'IDCategoryParent' => 4,
        'Name' => 'Thị trường trong nước',
        'Slug' => 'thi-truong-trong-nuoc',
        'OrderCategory' => 1,
        'Description' => 'Tin tức Thị trường trong nước',
        'Status' => 1,
    ],
    [
        'IDCategory' => 3,
        'IDCategoryParent' => 0,
        'Name' => 'Thị trường quốc tế',
        'Slug' => 'thi-truong-quoc-te',
        'OrderCategory' => 2,
        'Description' => 'Tin tức Thị trường quốc tế',
        'Status' => 1,
    ],
    [
        'IDCategory' => 4,
        'IDCategoryParent' => 0,
        'Name' => 'Tin tức công ty',
        'Slug' => 'tin-tuc-cong-ty',
        'OrderCategory' => 3,
        'Description' => 'Tin tức công ty Tràng An',
        'Status' => 1,
    ],
    [
        'IDCategory' => 5,
        'IDCategoryParent' => 1,
        'Name' => 'Thực phẩm',
        'Slug' => 'thuc-pham',
        'OrderCategory' => 1,
        'Description' => 'Tin tức thực phẩm',
        'Status' => 1,
    ]
];

function createNested($categories, $parentId = 0)
{
    $results = [];
    foreach($categories as $category) {
        if ($parentId == $category['IDCategoryParent']) {
            $nextParentId = $category['IDCategory'];

            $category['children'] = createNested($categories, $nextParentId);

            $results[] = $category;
        }
    }

    return $results;
}

$result = createNested($data);