PHP ağaçları yürümek en zarif yolu

0 Cevap php

Ben bu gibi ağaçlar var:

$tree = array("A", array(
            array("B", 1),
            array("C", 2),
            array("D",
                array("E",
                    array("F")),
                array("G")),
            array("H", 3)));

Her düğüm düğüm bir dizi, türünün ilk unsurdur ve diğer unsurlar düğümün argümanlar vardır (onlar diğer düğümlerin listesi, tek düğüm, bazı değer vb olabilir; düğüm hiçbir argüman, bir argüman veya daha fazla argüman olabilir).

Ağaçların bu tür yürümek en zarif yolu sizce nedir?

Ben iki olasılık geldi:

1) switch deyimini kullanarak

/*
 * + shorter
 * + fall-througs (easy way to handle more nodes with same code)
 *
 * - worse readability
 */
function my_tree_walker($tree)
{
    switch ($tree[0]) {
        case 'A':
            list($_, $subnodes) = $tree;
            $ret = '';

            foreach ($subnodes as $subnode) {
                $ret .= my_tree_walker($subnode);
            }

            return $ret;

        break;
        case 'B': /*...*/ break;
        case 'C': /*...*/ break;
        case 'D': /*...*/ break;
        case 'E': /*...*/ break;
        case 'F': /*...*/ break;
        case 'G': /*...*/ break;
        case 'H': /*...*/ break;
    }
}

Her bir düğüm türü için bir yöntem ile 2) nesne

/*
 * + better readability
 * + more declarative
 *
 * - longer
 * - `new static` is PHP >=5.3 only
 */

abstract class TreeWalker
{
    protected function __construct(){}

    final protected function walk($node)
    {
        $nodetype = array_shift($node);
        return call_user_func_array(array($this, 'walk' . $nodetype), $node);
    }

    public static function w($tree)
    {
        $instance = new static;
        return $instance->walk($tree);
    }
}

final class MyTreeWalker extends TreeWalker
{
    protected function __construct()
    {
        // initialize
    }

    private function walkA($subnodes)
    {
        $ret = '';

        foreach ($subnodes as $subnode) {
            $ret .= $this->walk($subnode);
        }

        return $ret;
    }

    private function walkB($n) { /*...*/ }
    private function walkC($n) { /*...*/ }
    private function walkD($subnode) { /*...*/ }
    private function walkE() { /*...*/ }
    private function walkF() { /*...*/ }
    private function walkG() { /*...*/ }
    private function walkH($n) { /*...*/ }
}

Yoksa ağaçları yürürken bile daha şık bir yol önerirsiniz?

Ben de düğümlerin her düğüm içinde yürüyüşler için yöntemler olurdu nesneler ve yerine ayrı ağaç yürüyüşe olmak düşündü. Ancak ben yürüyüşe kod parçaları farklı yerlerde yer alacak ve daha fazla düğüm için aynı şifreyi kullanmak zor olacak, çünkü korumak için kod zor olacağını düşünüyorum.

0 Cevap