使用类别树结构创建简单数组

时间:2014-12-21 17:12:48

标签: php arrays multidimensional-array categories

我想创建一个带有无限子类别的category-tree-array。无需在foreach循环中嵌套foreach循环。

目标是以正确的顺序拥有一系列类别,我可以将其用于多个其他功能。我需要能够轻松浏览此数组以查找更多基础数据。例如,获取并稍后显示驻留在这些类别中的(博客,页面或产品)项目。

看起来应该是这样的:

Array
(
    [0] => Array
        (
            [url] => url_to_cat
            [title] => Top Category 1
            [depth] => 0
    )
    [1] => Array
        (
            [url] => url_to_cat
            [title] => Top Category 2
            [depth] => 0
    )
    [2] => Array
        (
            [url] => url_to_cat
            [title] => Sub Category 1 of Category 2
            [depth] => 1
    )   
    [3] => Array
        (
            [url] => url_to_cat
            [title] => Sub Category 2 of Category 2
            [depth] => 1
    )   
    [4] => Array
        (
            [url] => url_to_cat
            [title] => Sub Category 1 of Sub Category 2
            [depth] => 2
    )       
)

在这个和其他网站的帮助下,我来到这个函数下面,这是正确的方向,但它让我得到一个多维数组。那将很难显示。

类别表包含以下字段:cat_id,parent_id,title。 网址来自另一个表格,这里并不重要。

function category_list($category_parent_id = 0) {

    static $cats;

    if (!is_array($cats)) {
        $sql = "SELECT * FROM category";
        $result = $db->query($sql);
        while ($record = $result->fetch_array()) {
            $cats[] = $record;
        }
    }

    foreach ($cats as $cat) {
        // if not a match, move on  
        if ((int) $cat['parent'] !== (int) $category_parent_id) {
            continue;
        }
        $item[$i]['url'] = 'url';
        $item[$i]['title'] = $cat['title'];
        $item[$i]['children'] = category_list($cat['cat_id']);

        $list_items[] = $item;
    }
    return $list_items;
}

最初的$ cats数组:

Array
(
    [0] => Array
        (
            [title] => Top Category 1
            [parent] => 0
            [cat_id] => 1
        )

    [1] => Array
        (
            [title] => Top Category 2
            [parent] => 0
            [cat_id] => 2
        )

    [2] => Array
        (
            [title] => Sub Category 1 of Category 2
            [parent] => 2
            [cat_id] => 3
        )

    [3] => Array
        (
            [title] => Sub Category 2 of Category 2
            [parent] => 2
            [cat_id] => 4
        )

    [4] => Array
        (
            [title] => Sub Sub Category 1 of Sub Category 2
            [parent] => 4
            [cat_id] => 5
        )

    [5] => Array
        (
            [title] => Sub Sub Sub Category 1 of Sub Sub Category 1
            [parent] => 5
            [cat_id] => 6
        )

)

我无法理解如何将子节点包含在主数组中,而不是将它们作为嵌套数组。

我已经搜索过,但在这里找不到合适的解决方案,所以如果结果是重复,我很抱歉。然后我想获得原始问题的链接。

1 个答案:

答案 0 :(得分:3)

我找到了它!

解决方案是使数组全局用于存储列表项。

此外,我还为该函数添加了$ level,以便我可以显示每个深度的特定类样式。

最后,函数的递归使用不会作为嵌套的"子数组"存储在数组中,而是传递给我最后返回的全局数组。

这给了我正确的数组:

function category_list($category_parent_id = 0, $level = 0) {

    // build our category list only once  
    static $cats;
    global $list_items

    if (!is_array($cats)) {
        $sql = "SELECT * FROM category";
        $result = $db->query($sql);
        while ($record = $result->fetch_array()) {
            $cats[] = $record;
        }
    }

    foreach ($cats as $cat) {
        // if not a match, move on  
        if ((int) $cat['parent'] !== (int) $category_parent_id) {
            continue;
        }
            $list_items[] = array ( 
                'title' => $cat['title'],
                'id' => $cat['cat_id'],
                'level'=> $level                   
            );
        category_list($cat['cat_id'], $level + 1);
    }

    return $list_items;
}

注意:在第二次测试中未使用Url,但这与示例无关。

Pfew。最后。