Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 分类树图_Php - Fatal编程技术网

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) 或者你小心地为叶子使用合适的保留名称。