0

私の目標は、人 Xから始まり、すべての子孫を示す家系図を表示することです。兄弟、両親、または他の先祖を表示する必要はありません。

この目的のために、私はpersonクラスを持っています。

と列を持つデータベーステーブルもperson_IDありparent_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 に答える