Php 分类树图
我正在尝试从类别构建一个树映射 我有类别(我有很多类别,我想删除重复项并在树状图视图中显示它们) …我希望他们像这样Php 分类树图,php,Php,我正在尝试从类别构建一个树映射 我有类别(我有很多类别,我想删除重复项并在树状图视图中显示它们) …我希望他们像这样 $categories = array( "Sneakers" => array( "Men" => array(), "Women" => array() ), "Accessories" => array( "Jewellery" => array(
$categories = array(
"Sneakers" => array(
"Men" => array(),
"Women" => array()
),
"Accessories" => array(
"Jewellery" => array(
"Men" => array(),
"Women" => array()
)
)
);
- Sneakers
-- Men
-- Women
- Accessories
-- Jewellery
--- Men
--- Women
把它们印成这样
$categories = array(
"Sneakers" => array(
"Men" => array(),
"Women" => array()
),
"Accessories" => array(
"Jewellery" => array(
"Men" => array(),
"Women" => array()
)
)
);
- Sneakers
-- Men
-- Women
- Accessories
-- Jewellery
--- Men
--- Women
试试这个:
<?php
$cat = array(
"Sneakers/Men",
"Sneakers/Women",
"Accessories/Jewellery/Men",
"Accessories/Jewellery/Women",
"Accessories/Jewellery/Men
");
function buildTree($categories, $result = []){
$temp = [];
foreach($categories as $categoryString){
$catParts = explode('/',$categoryString);
if(count($catParts) > 1){
$temp[$catParts[0]][] = str_replace($catParts[0].'/','',$categoryString);
} else {
$temp[$catParts[0]] = [];
}
}
foreach($temp as $elemName => $elemVal){
$result[$elemName] = buildTree($elemVal);
}
return $result;
}
var_dump(buildTree($cat));
试试这个:
<?php
$cat = array(
"Sneakers/Men",
"Sneakers/Women",
"Accessories/Jewellery/Men",
"Accessories/Jewellery/Women",
"Accessories/Jewellery/Men
");
function buildTree($categories, $result = []){
$temp = [];
foreach($categories as $categoryString){
$catParts = explode('/',$categoryString);
if(count($catParts) > 1){
$temp[$catParts[0]][] = str_replace($catParts[0].'/','',$categoryString);
} else {
$temp[$catParts[0]] = [];
}
}
foreach($temp as $elemName => $elemVal){
$result[$elemName] = buildTree($elemVal);
}
return $result;
}
var_dump(buildTree($cat));
最简单的方法是使用引用,如下所示:
$out = [];
foreach ($cat as $str) {
$lookup =& $out;
foreach (explode("/", $str) as $part) {
$lookup =& $lookup[$part];
if (!isset($lookup)) {
$lookup = [];
}
}
}
$lookup
最初引用整个预期结果,然后在每个步骤中扩展引用以遵循嵌套成员的路径
请注意,添加的每个新成员看起来都像member name=>[]
,因此实际上,即使最后的叶子也是数组:这可能看起来有点奇怪,但这是一种简化代码的好方法(每个成员总是准备好接收子成员)
不过,使用生成的数组然后按照OP的要求打印它并不困难:
function nest_print($src, $level = 0) {
$prefix = '<br />' . str_repeat('- ', ++$level);
foreach ($src as $key => $val) {
echo $prefix . $key;
if ($val) {
nest_print($val, $level);
}
}
}
nest_print($out);
(不过可能会以更优雅的方式改进)
下面是如何相应地修改打印结果片段:
function nest_print($src, $level = 0) {
$prefix = '<br />' . str_repeat('- ', ++$level);
foreach ($src as $key => $val) {
echo $prefix . $key;
if (is_array($val)) {
nest_print($val, $level);
} else {
echo ': ' . $val;
}
}
}
nest_print($out);
函数嵌套打印($src,$level=0){
$prefix='
'.str_repeat('-',++$level);
foreach($src as$key=>$val){
echo$前缀。$键;
if(is_数组($val)){
嵌套打印($val,$level);
}否则{
回音“:”.$val;
}
}
}
nest_打印($out);
最简单的方法是使用引用,如下所示:
$out = [];
foreach ($cat as $str) {
$lookup =& $out;
foreach (explode("/", $str) as $part) {
$lookup =& $lookup[$part];
if (!isset($lookup)) {
$lookup = [];
}
}
}
$lookup
最初引用整个预期结果,然后在每个步骤中扩展引用以遵循嵌套成员的路径
请注意,添加的每个新成员看起来都像member name=>[]
,因此实际上,即使最后的叶子也是数组:这可能看起来有点奇怪,但这是一种简化代码的好方法(每个成员总是准备好接收子成员)
不过,使用生成的数组然后按照OP的要求打印它并不困难:
function nest_print($src, $level = 0) {
$prefix = '<br />' . str_repeat('- ', ++$level);
foreach ($src as $key => $val) {
echo $prefix . $key;
if ($val) {
nest_print($val, $level);
}
}
}
nest_print($out);
(不过可能会以更优雅的方式改进)
下面是如何相应地修改打印结果片段:
function nest_print($src, $level = 0) {
$prefix = '<br />' . str_repeat('- ', ++$level);
foreach ($src as $key => $val) {
echo $prefix . $key;
if (is_array($val)) {
nest_print($val, $level);
} else {
echo ': ' . $val;
}
}
}
nest_print($out);
函数嵌套打印($src,$level=0){
$prefix='
'.str_repeat('-',++$level);
foreach($src as$key=>$val){
echo$前缀。$键;
if(is_数组($val)){
嵌套打印($val,$level);
}否则{
回音“:”.$val;
}
}
}
nest_打印($out);
这就是我搜索的内容。谢谢@Tomasz Winter。这是一种找出有多少类别重复的方法吗?例如,“配饰/珠宝/男人”是2次,结果数组类似于数组(“配饰”=>array(“珠宝”=>array(“男人”=>2))),这就是我搜索的。谢谢@Tomasz Winter。这是一种找出有多少类别重复的方法吗?例如,“配饰/珠宝/男士”为2次,结果数组类似于数组(“配饰”=>array(“珠宝”=>array(“男士”=>2))),这是一种确定有多少类别是重复的方法吗?例如,“配饰/珠宝/男士”为2次,结果数组类似于数组(“配饰”=>数组(“珠宝”=>数组(“男士”=>2)))哇,谢谢!你太棒了!它工作得很好,但我有一个错误警告:不能将标量值用作此行“$lookup=&$lookup[$part];”@MadalinAlexandru。。。我只是用与上面完全相同的代码片段进行了检查,没有发现任何错误。你是一次得到它,还是处理的步骤最多?不管怎样,您可以添加echo'
'吗$str.“->”$部分代码>就在$lookup=&$lookup[$part]之前代码>行,并报告您得到了什么?尝试更改$cat=数组(“运动鞋/男士”、“运动鞋/女士”、“配饰/珠宝/男士”、“配饰/珠宝/男士”、“配饰/珠宝/女士”、“配饰/珠宝/男士/阿迪达斯/添加”);你会得到error@MadalinAlexandru是的!这是很正常的:在丰富的源数据中,您现在有几个配件/珠宝/男士
,它们不是最终的叶子(而以前的是)。这是一个概念上的选择:一旦您决定一个最终叶将包含其出现次数(因此是一种与中间类别不同的对象),您就不能希望一个类别同时是最终叶和子类别的容器!因此,解决方案是:1)不再计算最后的叶子(它们仍然是可能的容器);2) 或者你小心地为叶子使用专有的保留名称。这是一种找出有多少类别是重复的方法吗?例如,“配饰/珠宝/男士”为2次,结果数组类似于数组(“配饰”=>数组(“珠宝”=>数组(“男士”=>2)))哇,谢谢!你太棒了!它工作得很好,但我有一个错误警告:不能将标量值用作此行“$lookup=&$lookup[$part];”@MadalinAlexandru。。。我只是用与上面完全相同的代码片段进行了检查,没有发现任何错误。你是一次得到它,还是处理的步骤最多?不管怎样,您可以添加echo'
'吗$str.“->”$部分代码>就在$lookup=&$lookup[$part]之前代码>行,并报告您得到了什么?尝试更改$cat=数组(“运动鞋/男士”、“运动鞋/女士”、“配饰/珠宝/男士”、“配饰/珠宝/男士”、“配饰/珠宝/女士”、“配饰/珠宝/男士/阿迪达斯/添加”);你会得到error@MadalinAlexandru是的!这是很正常的:在丰富的源数据中,您现在有几个配件/珠宝/男士
,它们不是最终的叶子(而以前的是)。这是一个概念上的选择:一旦您决定一个最终叶将包含其出现次数(因此是一种与中间类别不同的对象),您就不能希望一个类别同时是最终叶和子类别的容器!因此,解决方案是:1)不再计算最后的叶子(它们仍然是可能的容器);2) 或者你小心地为叶子使用合适的保留名称。