我可以访问返回产品类别/子类别数组的API,如下所示:
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可以是子猫,甚至是猫,函数应该返回正确的层次结构路径:所以对于猫,它应该返回猫的名字,对于子猫,它应该返回猫>子猫。
有人能帮我建这个吗?不幸的是,我想不出正确的算法来执行这个复杂的任务.
发布于 2022-11-15 03:59:57
它可以通过通过数据进行简单的迭代来解决,保持应用于数组中当前元素的类别:
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
编辑:
以下函数使用相同的键创建一个新数组,但值由完整的类别路径替换:
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://stackoverflow.com/questions/74440206
复制相似问题