0

この質問の依存関係クラスを使用しています。特にPaulNormanのバージョンを使用しているPHP依存関係クラスは、ほぼ完全に機能しますが、順序が常に正しくなるとは限らないことがわかりました。

ここでコードを確認できますhttp://codepad.org/EBtWWn1b

結果は間違っています、それはあるべきです

ロード済み:配列
((
    [0]=>メニュー
    [1]=>設定
    [2]=>国
    [3]=>ダッシュボード
    [4]=>言語
    [5]=>モジュール
    [6]=>ユーザー
)。
失敗:アレイ
((
)。

あなたはそれを修正する方法を知っていますか?

ありがとう !

4

1 に答える 1

2

Paul Normanの解決策について何を言うべきかわかりませんが、バグがあるようです...解決策を試してみましたが、例の依存関係を満たしているようです(ただし、正確にはリストされていません)あなたが望む順序...)

class Dependencies
{
    private $items;
    private $depends;
    private $hasDependency;

    public function __construct()
    {
        $this->items = array();
        $this->depends = array();
        $this->hasDependency = array();
    }

    public function add($item, $dependsOn = array())
    {
        $this->items[] = $item;
        foreach ($dependsOn as $dependsOnItem)
        {
            $this->items[] = $dependsOnItem;
            $this->depends[$dependsOnItem][] = $item;
        }

        $this->items = array_unique($this->items);
        $this->hasDependency[$item] = $dependsOn;
    }

    public function getLoadOrder()
    {
        $order = array();

        $hasChanged = true;
        while (count($order) < count($this->items) && $hasChanged === true)
        {
            $hasChanged = false;
            foreach ($this->hasDependency as $item => $dependencies)
            {
                if ($this->satisfied($item, $order))
                {
                    $order[] = $item;
                    unset($this->hasDependency[$item]);
                    $hasChanged = true;
                }
            }
        }

        if (count($order) < count($this->items) && $hasChanged === false)
        {
            echo 'Impossible set of dependencies';
            return false;
        }

        return $order;
    }

    private function satisfied($item, $addedSoFar)
    {
        $dependencies = $this->hasDependency[$item];

        foreach ($dependencies as $dependency)
        {
            if (!in_array($dependency, $addedSoFar))
            {
                return false;
            }
        }

        return true;
    }
}

$deps = new Dependencies();

$deps->add('countries', array('menus', 'settings'));
$deps->add('dashboard', array('menus'));
$deps->add('languages', array('menus', 'settings'));
$deps->add('menus');
$deps->add('modules'  , array('menus'));
$deps->add('settings' , array('menus'));
$deps->add('users'    , array('menus'));

print_r($deps->getLoadOrder());
于 2012-09-10T04:45:07.727 に答える