0

我的目标是显示从X 人开始并显示所有后代的家谱。无需显示兄弟姐妹、父母或其他祖先。

为此我有一person堂课。

我还有一个带有person_IDparent_ID列的数据库表。

创建person类时,您将所需的人员 ID 传递给它,然后它将从该表中预加载其父 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只制作树的类吗?

4

1 回答 1

1

您可以利用复合设计模式

这是另一个资源: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();
于 2012-08-22T07:46:51.017 回答