PHP-PHP+xml的无限分类树目录的方法?

PHP-PHP+xml的无限分类树目录的方法?

瑾兮 发布于 2017-09-24 字数 3325 浏览 1375 回复 1

可能重复的问题
PHP+XML怎么遍历树目录下的父子节点

下面是我的xml结构 求大婶帮我解决下
<?xml version="1.0" encoding="utf-8" ?>

<!--

  • phpMyAdmin XML Dump
  • version 2.8.2
  • http://www.phpmyadmin.net
  • 主机: localhost
  • 生成日期: 2012 年 08 月 16 日 11:45
  • 服务器版本: 5.0.22
  • PHP 版本: 5.0.4
    -->

<!--
- 数据库: news
-->
<news>
<!-- 表 sitemap -->
<sitemap>
<Pid>1</Pid>
<substance>商铺门面</substance>
<Fid>0</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>2</Pid>
<substance>写字楼租售</substance>
<Fid>0</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>3</Pid>
<substance>厂房仓库土地</substance>
<Fid>0</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>4</Pid>
<substance>加盟商机</substance>
<Fid>0</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>5</Pid>
<substance>商铺首页</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>6</Pid>
<substance>商铺出售</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>7</Pid>
<substance>商铺出租</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>8</Pid>
<substance>商铺转让</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>9</Pid>
<substance>网络经纪人</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>10</Pid>
<substance>商铺新闻</substance>
<Fid>1</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>11</Pid>
<substance>阿斯达斯</substance>
<Fid>2</Fid>
<URL></URL>
</sitemap>
<sitemap>
<Pid>12</Pid>
<substance>大苏打</substance>
<Fid>2</Fid>
<URL></URL>
</sitemap>
</news>

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清晨说ぺ晚安 2017-10-06 1 楼

无限分类树的代码有很多,下面是个示例:

<?php
/**
by lenush;
*/
class Tree
{
var $data = array();
var $child = array(-1=>array());
var $layer = array(-1=>-1);
var $parent = array();

function Tree ($value)
{
$this->setNode(0, -1, $value);
} // end func

function setNode ($id, $parent, $value)
{
$parent = $parent?$parent:0;

$this->data[$id] = $value;
$this->child[$id] = array();
$this->child[$parent][] = $id;
$this->parent[$id] = $parent;

if (!isset($this->layer[$parent]))
{
$this->layer[$id] = 0;
}
else
{
$this->layer[$id] = $this->layer[$parent] + 1;
}
} // end func

function getList (&$tree, $root= 0)
{
foreach ($this->child[$root] as $key=>$id)
{
$tree[] = $id;

if ($this->child[$id]) $this->getList($tree, $id);
}
} // end func

function getValue ($id)
{
return $this->data[$id];
} // end func

function getLayer ($id, $space = false)
{
return $space?str_repeat($space, $this->layer[$id]):$this->layer[$id];
} // end func

function getParent ($id)
{
return $this->parent[$id];
} // end func

function getParents ($id)
{
while ($this->parent[$id] != -1)
{
$id = $parent[$this->layer[$id]] = $this->parent[$id];
}

ksort($parent);
reset($parent);

return $parent;
} // end func

function getChild ($id)
{
return $this->child[$id];
} // end func

function getChilds ($id = 0)
{
$child = array($id);
$this->getList($child, $id);

return $child;
} // end func
} // end class

//new Tree(根目录的名字);
//根目录的ID自动分配为0
$Tree = new Tree('目录导航');

//setNode(目录ID,上级ID,目录名字);
$Tree->setNode(1, 0, '目录1');
$Tree->setNode(2, 1, '目录2');
$Tree->setNode(3, 0, '目录3');
$Tree->setNode(4, 3, '目录3.1');
$Tree->setNode(5, 3, '目录3.2');
$Tree->setNode(6, 3, '目录3.3');
$Tree->setNode(7, 2, '目录2.1');
$Tree->setNode(8, 2, '目录2.2');
$Tree->setNode(9, 2, '目录2.3');
$Tree->setNode(10, 6, '目录3.3.1');
$Tree->setNode(11, 6, '目录3.3.2');
$Tree->setNode(12, 6, '目录3.3.3');

//getChilds(指定目录ID);
//取得指定目录下级目录.如果没有指定目录就由根目录开始
$category = $Tree->getChilds();

//遍历输出
foreach ($category as $key=>$id)
{
echo $Tree->getLayer($id, '|-').$Tree->getValue($id)."<br />n";
}
?>

你的需求中需要从xml文件读取组装成菜单,但是不知道你的xml结构,因此提高一个简单的xml解析方法,可以结合上面的程序使用。

<?php
$data = implode("",file('menu.xml'));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $xml_array, $tags);
xml_parser_free($parser);

$showMe = xmlToArr($xml_array);

echo "<pre>";
print_r ($showMe);
echo "</pre>";

function xmlToArr($xml_array,&$index=0,$start=0){
$num = count($xml_array);
$result = array();
for ($i = $start; $i < $num; $i++){
if ('open' == $xml_array[$i]['type']){
$start = $i+1;
$result[$xml_array[$i]['attributes']['ID']] = xmlToArr($xml_array,$index,$start);
$i = $index;
}else if ('close' == $xml_array[$i]['type']){
$index = $i;
return $result;
}else if ('complete' == $xml_array[$i]['type']){
$result[$xml_array[$i]['attributes']['ID']] = null;
}
}
return $result;
}
?>