【问题标题】:How to export product full categories path from a hierarchical tree?如何从分层树中导出产品完整类别路径?
【发布时间】:2014-08-24 05:07:16
【问题描述】:

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

大批 ( [0] => 数组 ( [id] => 1 [parent_id] => 0 [名称] => A 类 ) [1] => 数组 ( [id] => 2 [parent_id] => 1 [名称] => 子类别 A1 ) [2] => 数组 ( [id] => 3 [parent_id] => 2 [名称] => 子子类别 A1 ) [3] => 数组 ( [id] => 4 [parent_id] => 1 [名称] => 子类别 A2 ) [4] => 数组 ( [id] => 5 [parent_id] => 0 [名称] => B 类 ) [5] => 数组 ( [id] => 6 [parent_id] => 5 [名称] => 子类别 B ) )

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

我的输出应该是:

类别A/子类别A1/子子类别A1,类别A/子类别A2,类别B/子类别B

[编辑] 我可以将起始数组转换为这个

大批 ( [0] => 数组 ( [id] => 1 [parent_id] => 0 [名称] => A 类 [孩子] => 数组 ( [0] => 数组 ( [id] => 2 [parent_id] => 1 [名称] => 子类别 A1 [孩子] => 数组 ( [0] => 数组 ( [id] => 3 [parent_id] => 2 [名称] => 子子类别 A1 ) ) ) [1] => 数组 ( [id] => 4 [parent_id] => 1 [名称] => 子类别 A2 ) ) ) [1] => 数组 ( [id] => 5 [parent_id] => 0 [名称] => B 类 [孩子] => 数组 ( [0] => 数组 ( [id] => 6 [parent_id] => 5 [名称] => 子类别 B1 ) ) ) )

【问题讨论】:

    标签: php recursion hierarchical-data virtuemart


    【解决方案1】:

    给定下一个数组:

    $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;
    

    希望对你有帮助。

    【讨论】:

    • 实际上,这并不是您所需要的,因为它还为您提供了每个类别路径,而不是所有最后一个类别的子路径。
    • 编辑:仅获取最后一个类别的子路径。
    • @Meeuuuhhhhh 我在孩子之前并不总是有父母,但我将起始数组冷转换为分层数组,编辑后
    • @Andrea Parmeggiani 好吧,我想递归函数现在是一个很好的解决方案,答案已编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 2013-01-06
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多