2012-09-10 57 views
0

我正在使用從這個問題的依賴類PHP dependency class我特別使用保羅諾曼版本,它的工作幾乎完美,但我發現訂單並不總是出來correcltyPHP - 依賴類

您可以點擊這裏http://codepad.org/EBtWWn1b

的結果是錯誤的代碼,它應該是

Loaded: Array 
(
    [0] => menus 
    [1] => settings 
    [2] => countries 
    [3] => dashboard 
    [4] => languages 
    [5] => modules 
    [6] => users 
) 
Failed: Array 
(
) 

你知道什麼辦法來解決呢?

謝謝!

+0

你有沒有做過自己的研究? – zerkms

+0

我已經嘗試過對它們進行排序,但它們並沒有按照他們需要的方式來。我試着對數組$ _dependencies進行排序,但沒有運氣也,我試着搜索PHP拓撲排序函數/類,它發現的第一個結果是非常混淆使用IMO .. –

回答

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()); 
+0

謝謝它的作品,但我有一個小問題,我刪除我的其他兩個意見,只是爲了不混淆任何人..我改變了添加函數的工作方式,我試圖檢索無法排序的項目,因爲缺少依賴關係,但它不能正常工作以及http:// codepad。 org/cxKifX6U通過的項目是好的,但方式。 crm項目永遠不會添加到發生故障的陣列中= \ –

+0

我對延遲感到抱歉,但我不清楚「無法排序的項目」的含義。我的理解是,你只是想確保你在依賴它們的依賴項之前獲得所有依賴項。如果您的依賴關係中沒有周期,它們都不會失敗。 – xbakesx

+0

沒問題=),我設法得到我需要的工作,不使用這個類的想法,但是我將在安裝我的應用程序時使用這個類。事情是,我有一個模塊化系統,每個模塊都可以有依賴和依賴..所以當系統安裝時,我可以管理模塊,如安裝,卸載,啓用和禁用模塊......需要的是我需要檢查是否可以安裝一個具有依賴關係的模塊,我在模塊類中實現了一些功能來完成所需的檢查,並且它出現了很好=)但是感謝您的類= D –