父母,子女,递归列表和方法结构

时间:2012-08-22 07:34:33

标签: php oop recursion

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

为此,我有一个person课程。

我还有一个包含person_IDparent_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类吗?

1 个答案:

答案 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();