Php 如何从层次结构树导出产品完整类别路径?

Php 如何从层次结构树导出产品完整类别路径?,php,recursion,hierarchical-data,virtuemart,Php,Recursion,Hierarchical Data,Virtuemart,我的起点是一个包含类别ID及其父ID的数组,来自Virtuemart categories表,如下所示: Array ( [0] => Array ( [id] => 1 [parent_id] => 0 [name] => Category A ) [1] => Array ( [id] => 2 [paren

我的起点是一个包含类别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 ) ) 排列 ( [0]=>阵列 ( [id]=>1 [parent_id]=>0 [名称]=>A类 ) [1] =>阵列 ( [id]=>2 [parent_id]=>1 [名称]=>子类别A1 ) [2] =>阵列 ( [id]=>3 [家长id]=>2 [名称]=>子类别A1 ) [3] =>阵列 ( [id]=>4 [parent_id]=>1 [名称]=>子类别A2 ) [4] =>阵列 ( [id]=>5 [parent_id]=>0 [名称]=>B类 ) [5] =>阵列 ( [id]=>6 [家长id]=>5 [名称]=>子类别B ) ) 我需要有一个字符串,其中每个类别的子完整路径在子级之间用/(斜杠)分隔,在第一级父级之间用(逗号)分隔

我的输出应该是:

Category A/Subcategory A1/Sub-Subcategory A1,Category A/Subcategory A2,Category B/Subcategory B 类别A/子类别A1/子类别A1、类别A/子类别A2、类别B/子类别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 ) ) ) ) 排列 ( [0]=>阵列 ( [id]=>1 [parent_id]=>0 [名称]=>A类 [子项]=>数组 ( [0]=>阵列 ( [id]=>2 [parent_id]=>1 [名称]=>子类别A1 [子项]=>数组 ( [0]=>阵列 ( [id]=>3 [家长id]=>2 [名称]=>子类别A1 ) ) ) [1] =>阵列 ( [id]=>4 [parent_id]=>1 [名称]=>子类别A2 ) ) ) [1] =>阵列 ( [id]=>5 [parent_id]=>0 [名称]=>B类 [子项]=>数组 ( [0]=>阵列 ( [id]=>6 [家长id]=>5 [名称]=>子类别B1 ) ) ) ) 给定下一个数组:

$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;
function递归函数($elementArray,$parentString=''){
if(isset($elementArray['children'])&&!empty($elementArray['children'])){
foreach($elementArray['children']作为$keyChild=>$child){

$resultString.=recursiveFunction($child、$parentString.$elementArray['name']./'))(($KeyChild实际上,它并不完全是您所需要的,因为它还提供了每个类别路径,而不是所有最后一个类别的子路径。编辑:仅获取最后一个类别的子路径。@meeuuuhhhh我不总是在子级之前有父级,但我将起始数组冷转换为分层数组,postedited@AndreaParmeggiani好的,递归f“我想,unction现在是一个很好的解决方案,”答案编辑。