首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据数组中的出现顺序创建父-子关系的算法

根据数组中的出现顺序创建父-子关系的算法
EN

Stack Overflow用户
提问于 2022-11-15 03:07:10
回答 1查看 29关注 0票数 0

我可以访问返回产品类别/子类别数组的API,如下所示:

代码语言:javascript
复制
Array
(
    [1] => CATEGORY 1
    [2] => -Subcat 1
    [9] => -Subcat 2
    [12] => -Subcat 3
    [13] => -Subcat 4
    [46] => -Subcat 5
    [47] => -Subcat 6
    [3] => CATEGORY 2
    [4] => -Subcat 1
    [68] => -Subcat 2
    [69] => -Subcat 3
    [154] => -Subcat 4
    [5] => CATEGORY 3
    [6] => -Subcat 1
    [7] => -Subcat 2
    [76] => --Subsubcat 1
    [156] => --Subsubcat 2
    [157] => --Subsubcat 3
    [10] => -Subcat 3
    [11] => -Subcat 4
    [20] => -Subcat 5
    [54] => -Subcat 6
    [55] => -Subcat 7
    [56] => --Subsubcat 1
    [60] => --Subsubcat 2
    [65] => --Subsubcat 3
    [74] => --Subsubcat 4
    [61] => -Subcat 8
)

我不确定它是否明显,但是子猫(一个深度符号:-)是最后一个猫的直接子符号(没有深度符号),子子猫(两个深度符号:-)是最后一个子猫的直接子子(由一个深度符号-表示)。

因此,[56] => --Subsubcat 1[55] => -Subcat 7的孩子(它的兄弟姐妹是[60] => --Subsubcat 2[65] => --Subsubcat 3等),而[55] => -Subcat 7是猫[5] => CATEGORY 3的孩子。

我知道这很尴尬,但事实就是这样,我也无法改变它.我的问题是,我需要从上面的数组中构建一个包含任何请求id的层次树.因此,我希望构建一个函数,它将接受一个$id作为param (例如65),并构建整个层次结构树,因此对于65,它应该返回CATEGORY 3 > Subcat 7 > Subsubcat 3.

编辑:我不会总是把一个子猫的id传递给函数。id可以是子猫,甚至是猫,函数应该返回正确的层次结构路径:所以对于猫,它应该返回猫的名字,对于子猫,它应该返回猫>子猫。

有人能帮我建这个吗?不幸的是,我想不出正确的算法来执行这个复杂的任务.

EN

回答 1

Stack Overflow用户

发布于 2022-11-15 03:59:57

它可以通过通过数据进行简单的迭代来解决,保持应用于数组中当前元素的类别:

代码语言:javascript
复制
function parents($data, $target){
    $subcats = [];
    foreach($data as $val=>$cat){
        preg_match("/^-*[^\-]/", $cat, $a);
        $level = strlen($a[0]) - 1;
        $subcats[$level] = substr($cat, $level);
        array_splice($subcats, $level+1);
        if($val == $target){
            return implode(' > ', $subcats);
        }
    }
    return "";// not found
}

$data = Array
(
    1 => "CATEGORY 1",
    2 => "-Subcat 1",
    9 => "-Subcat 2",
    12 => "-Subcat 3",
    13 => "-Subcat 4",
    46 => "-Subcat 5",
    47 => "-Subcat 6",
    3 => "CATEGORY 2",
    4 => "-Subcat 1",
    68 => "-Subcat 2",
    69 => "-Subcat 3",
    154 => "-Subcat 4",
    5 => "CATEGORY 3",
    6 => "-Subcat 1",
    7 => "-Subcat 2",
    76 => "--Subsubcat 1",
    156 => "--Subsubcat 2",
    157 => "--Subsubcat 3",
    10 => "-Subcat 3",
    11 => "-Subcat 4",
    20 => "-Subcat 5",
    54 => "-Subcat 6",
    55 => "-Subcat 7",
    56 => "--Subsubcat 1",
    60 => "--Subsubcat 2",
    65 => "--Subsubcat 3",
    74 => "--Subsubcat 4",
    61 => "-Subcat 8",
);
    
foreach([154, 65, 5, 157, 159] as $test){
    echo $test . ":" . parents($data, $test) . "\n";
}

https://onecompiler.com/php/3ynz78nwh

编辑:

以下函数使用相同的键创建一个新数组,但值由完整的类别路径替换:

代码语言:javascript
复制
function parentsAll($data){
    $parents = Array();
    $subcats = [];
    foreach($data as $val=>$cat){
        preg_match("/^-*[^\-]/", $cat, $a);
        $level = strlen($a[0]) - 1;
        $subcats[$level] = substr($cat, $level);
        array_splice($subcats, $level+1);
        $parents[$val] = implode(' > ', $subcats);
    }
    return $parents;
}

https://onecompiler.com/php/3ynzaaard

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74440206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档