我的目标是显示从人物X 开始并显示所有后代的族谱。无需向兄弟姐妹,父母或其他祖先展示。
为此,我有一个person
课程。
我还有一个包含person_ID
和parent_ID
列的数据库表。
当创建person
类时,您将其传递给所需的人员ID,然后它将从该表中预加载其父项和子项ID。
为了创建后代树,我在person
类中编写了以下方法:
public function loadChildren() {
foreach ($this->_ChildIDs as $curChildID) {
$child = new Person();
$child->loadSelfFromID($curChildID);
$child->loadChildren();
$this->_Children[] = $child;
}
}
这成功地递归加载了整个后代树。
到目前为止一切顺利。
为了将这些数据显示为嵌套的HTML列表,我编写了以下独立函数:
function recursivePrint($array) {
echo '<ul>';
foreach ($array as $child) {
echo '<li>'.$child->getName();
recursivePrint($child->getChildren());
echo '</li>';
}
echo '</ul>';
}
最后的脚本如下所示:
$c = new Person();
$c->loadSelfFromID('1');
$c->loadChildren(); // recursively loads all descendants
$descendants = $c->getChildren();
recursivePrint($descendants);
//Output is as expected.
我的问题是:我在哪里坚持这个独立功能?
它是否只是被一个随机实用程序包含在其他地方没有的功能中?应该进入person
班吗?它应该进入只生成树的FamilyTree
类吗?
答案 0 :(得分:1)
您可以利用Composite Design Pattern。
这是另一种资源:http://devzone.zend.com/364/php-patterns_the-composite-pattern/
修改强>
class Person
{
public $name;
protected $_descendants = null;
public function __construct($name)
{
$this->name = $name;
$this->_descendants = array();
}
public function addDescendant(Person $descendant)
{
$i = array_search($descendant, $this->_descendants, true);
if($i === false){
$this->_descendants[] = $descendant;
}
}
public function toString()
{
$str = $this->name;
if(count($this->_descendants) > 0){
$str .= PHP_EOL . '<ul>' . PHP_EOL;
foreach($this->_descendants as $descendant){
$str .= '<li>' . $descendant->toString() . '</li>' . PHP_EOL;
}
$str .= '</ul>' . PHP_EOL;
}
return $str;
}
}
$dad = new Person('Dad');
$dad->addDescendant(new Person('Big sister'));
$dad->addDescendant(new Person('Big brother'));
$dad->addDescendant(new Person('Little brat'));
$grandMa = new Person('GrandMa');
$grandMa->addDescendant($dad);
echo $grandMa->toString();