当前位置: 首页 > 知识库问答 >
问题:

如何从分层树导出产品全类别路径?

方茂
2023-03-14

我的起点是一个包含类别ID及其父ID的数组,来自Virtuemart categories表,如下所示:

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Category A
        )

    [1] => Array
        (
            [id] => 2
            [parent_id] => 1
            [name] => Subcategory A1
        )

    [2] => Array
        (
            [id] => 3
            [parent_id] => 2
            [name] => Sub-Subcategory A1
        )

    [3] => Array
        (
            [id] => 4
            [parent_id] => 1
            [name] => Subcategory A2
        )

    [4] => Array
        (
            [id] => 5
            [parent_id] => 0
            [name] => Category B
        )

    [5] => Array
        (
            [id] => 6
            [parent_id] => 5
            [name] => Subcategory B
        )

)

我需要有一个字符串,每个最后类别的孩子完整的路径由/(斜杠)之间的孩子和由,(逗号)之间的第一级父母

我的输出应该是:

Category A/Subcategory A1/Sub-Subcategory A1,Category A/Subcategory A2,Category B/Subcategory B

我可以把启动数组转换成这个

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [name] => Category A
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [parent_id] => 1
                            [name] => Subcategory A1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                            [parent_id] => 2
                                            [name] => Sub-Subcategory A1
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [id] => 4
                            [parent_id] => 1
                            [name] => Subcategory A2

                        )

                )

        )

    [1] => Array
        (
            [id] => 5
            [parent_id] => 0
            [name] => Category B
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 6
                            [parent_id] => 5
                            [name] => Subcategory B1

                        )

                )

        )

)

共有1个答案

隆长卿
2023-03-14

给定下一个数组:

$array = Array(
    "0" => Array
        (
        "id" => 1,
        "parent_id" => 0,
        "name" => "Category A"
    ),
    "1" => Array
        (
        "id" => 2,
        "parent_id" => 1,
        "name" => "Subcategory A1"
    ),
    "2" => Array
        (
        "id" => 3,
        "parent_id" => 2,
        "name" => "Sub-Subcategory A1"
    ),
    "3" => Array
        (
        "id" => 4,
        "parent_id" => 1,
        "name" => "Subcategory A2"
    ),
    "4" => Array
        (
        "id" => 5,
        "parent_id" => 0,
        "name" => "Category B"
    ),
    "5" => Array
        (
        "id" => 6,
        "parent_id" => 5,
        "name" => "Subcategory B"
    )
);

诸如此类:

$tabOfElements = array();
foreach($array as $element){
    $tabOfElements[$element['id']] = (isset($tabOfElements[$element['parent_id']])?$tabOfElements[$element['parent_id']].'/':'').$element['name'];
}
$stringOfCategories = implode(',',$tabOfElements);

你应该做你需要的。注意:仅当父类别在数组中始终位于其子类别之前时,此选项才有效。

编辑:

要只获取所有最后类别子路径,可以执行以下操作:

$tabOfElements = array();
$elementsToDelete = array();
foreach($array as $element){
    $tabOfElements[$element['id']] = (isset($tabOfElements[$element['parent_id']])?$tabOfElements[$element['parent_id']].'/':'').$element['name'];       
    if(isset($tabOfElements[$element['parent_id']]) && !isset($elementsToDelete[$element['parent_id']])){
        $elementsToDelete[$element['parent_id']] = $element['parent_id'];
    }
}
$finalArray = array_diff_key($tabOfElements, $elementsToDelete);
$stringOfCategories = implode(',',$finalArray);

这将给你:

Category A/Subcategory A1/Sub-Subcategory A1,Category A/Subcategory A2,Category B/Subcategory B

编辑2:对于给定的第二个数组,可以使用如下递归函数

function recursiveFunction($elementArray, $parentString = ''){
    if(isset($elementArray['children']) && !empty($elementArray['children'])){
        foreach($elementArray['children'] as $keyChild=>$child){
            $resultString .= recursiveFunction($child, $parentString.$elementArray['name'].'/').(($keyChild<count($elementArray['children'])-1)?',':'');
        }
        return $resultString;
    }else{
        return $parentString.$elementArray['name'];
    }
}

$tabOfPaths = array();
foreach($array as $elementArray){
    $tabOfPaths[] = recursiveFunction($elementArray);
}
$stringOfPaths = implode(',',$tabOfPaths);
echo $stringOfPaths;

希望能有帮助。

 类似资料:
  • 因此,让我们假设我有一个MySQL DB,其中包含以下表: 产品 < li>id < li >名称 < li >类别id 类别 < li>id < li >名称 < li>parent_id 查询数据库的最佳方式是什么,以获得从某个类别id开始的所有产品。例如,如果我有一个子类别树,其中基本类别id=,我如何获得id=子类别下的所有产品,子类别的数量不确定。 我可以这样做: 但是,它仅适用于类别i

  • 我的数据库中有两个表: 我怎么能这样回报: 我在类别表中使用“WITH RECURSIVE”,但找不到将产品表与1次查询相结合的方法。我使用这里的例子 最好的方法是什么?

  • 我有一个名为“产品类型”的WooCommerce产品类别,我试图列出该类别下的所有类别,但不是这些类别的子类别。例如,我有: 产品类型 碳化物米尔斯 钓鱼工具 儿童类别 我希望它列出“电石磨坊”和“打捞工具”,但不是“儿童类别”。 这是我的代码: 但它仍然返回“儿童类别”。我不知道为什么将深度限制为“1”并将“include_children”设置为“false”不能解决这个问题。

  • 我至少有4个父类别,每个父类别都有一个子类别。 WordPress中的类别如下所示: > 利丁ö(父类别) Direktåtkomst Förrådslänga(子类别) 1kbm(产品) 1.5千伏安(产品) Nacka(父类别) 样本(子类别) aa(产品) bbb(产品) 我想查询WordPress中的产品,它们应该按类别分组。 这是我当前的代码: 我认为上面的代码不正确,因为每个分页都显示

  • 问题内容: 我有一个包含一个类别的FK的产品表,创建类别表的方式是每个类别都可以有一个父类别,例如: 我需要进行选择查询,如果选择的类别是“处理器”,它将返回英特尔,奔腾,Core 2 Duo,AMD等产品。 我考虑过要创建某种“缓存”,该缓存将为数据库中的每个类别存储层次结构中的所有类别,并在where子句中包含“ IN”。这是最好的解决方案吗? 问题答案: 最好的解决方案是在数据库设计阶段。您

  • 我有服装产品。一种产品有多个类别,如“性别”(“男性”或“女性”)和“类型”(如“裤子”、“衬衫”等)。 我想列出所有类别和子类别的“类型”从产品中存在的“男子”类别。 "type"类别的ID: 1696 这段代码给了我1696下的所有类别,但我只想从也属于“男性”类别的产品中获得“类型”类别。 我明白了吗? 非常感谢你的帮助。