我不知道該怎麼告訴你關於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());
你有沒有做過自己的研究? – zerkms
我已經嘗試過對它們進行排序,但它們並沒有按照他們需要的方式來。我試着對數組$ _dependencies進行排序,但沒有運氣也,我試着搜索PHP拓撲排序函數/類,它發現的第一個結果是非常混淆使用IMO .. –