PHP相关性类 [英] PHP dependency class

查看:141
本文介绍了PHP相关性类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

类:

 类DEPS {  变量$物品;  函数add($项目,$ DEPS =阵列()){
    $这个 - >项目[$项目= $ DEPS;
  }
}

我怎么能生成$数组考虑到依赖($ DEPS)订购的商品?

例如:

  $ DEPS =新DEPS;$ deps->添加('ITEM2',阵列('ITEM1')); //<  - 取决于ITEM1
$ deps->添加('ITEM1',阵列()); //< - 不依赖
$ deps->添加(项目3,阵列('ITEM1','ITEM5')); //< - 取决于ITEM1和ITEM5
$ deps->添加('A',阵列('项目3')); //< - 关于项目3
$ deps->添加('C',阵列('ITEM2','ITEM1')); // ......

的有序排列是:

  ITEM1
ITEM2
C

和第二个数组,物品,需要一个或多个依赖不存在的:

 项目3
一个


解决方案

是这样的:

 类DEPS {
  保护$项目=阵列();  公共函数add($项目,数组$ DEPS =阵列()){
    $这个 - >项目[$项目= $ DEPS;
  }  保护功能checkDependencies($项目){
    如果(!使用isset($这个 - >项目[$项目])){
      返回false;
    }    的foreach($这个 - >项目[$项目]为$ DEP){
      如果(这 - $>!checkDependencies($ DEP)){
        返回false;
      }
    }    返回true;
  }  公共职能getResolved(){
    $结果=阵列();    的foreach($这个 - >项目为$项目=> $ DEPS){
      如果($这个 - > checkDependencies($项目)){
        $结果[] = $项目;
      }
    }    返回$结果;
  }  公共职能getUnresolved(){
    $结果=阵列();    的foreach($这个 - >项目为$项目=> $ DEPS){
      如果(这 - $>!checkDependencies($项目)){
        $结果[] = $项目;
      }
    }    返回$结果;
  }
}$ DEPS =新DEPS;$ deps->添加('ITEM2',阵列('ITEM1')); //< - 取决于ITEM1
$ deps->添加('ITEM1',阵列()); //< - 不依赖
$ deps->添加(项目3,阵列('ITEM1','ITEM5')); //< - 取决于ITEM1和ITEM5
$ deps->添加('A',阵列('项目3')); //< - 关于项目3
$ deps->添加('C',阵列('ITEM2','ITEM1')); // ......的print_r($ deps-> getResolved());
/ *
排列

    [0] => ITEM2
    [1] => ITEM1
    [2] => C

* /的print_r($ deps-> getUnresolved());
/ *
排列

    [0] =>项目3
    [1] =>一个

* /

HTTP://$c$cpad.org/fSwJjyz5

The class:

class deps{

  var $items;

  function add($item, $deps = array()){
    $this->items[$item] = $deps;
  }


}

How can I generate an array with $items ordered by taking into account dependencies ($deps) ?

For example:

$deps = new deps;

$deps->add('item2', array('item1'));            // <- depends on item1
$deps->add('item1', array());                   // <- no dependency
$deps->add('item3', array('item1', 'item5'));   // <- depends on item1 and item5
$deps->add('A',     array('item3'));            // <- on item3
$deps->add('C',     array('item2', 'item1'));   // ......

The ordered array would be:

item1
item2
C

And a second array, with items that needed one or more dependencies that didn't exist:

item3       
A

解决方案

Something like:

class deps{
  protected $items = array();

  public function add($item, array $deps = array()){
    $this->items[$item] = $deps;
  }

  protected function checkDependencies($item) {
    if (!isset($this->items[$item])) {
      return false;
    }

    foreach ($this->items[$item] as $dep) {
      if (!$this->checkDependencies($dep)) {
        return false;
      }
    }

    return true;
  }

  public function getResolved() {
    $result = array();

    foreach ($this->items as $item => $deps) {
      if ($this->checkDependencies($item)) {
        $result[] = $item;
      }
    }

    return $result;
  }

  public function getUnresolved() {
    $result = array();

    foreach ($this->items as $item => $deps) {
      if (!$this->checkDependencies($item)) {
        $result[] = $item;
      }
    }

    return $result;
  }
}

$deps = new deps;

$deps->add('item2', array('item1'));            // <- depends on item1
$deps->add('item1', array());                   // <- no dependency
$deps->add('item3', array('item1', 'item5'));   // <- depends on item1 and item5
$deps->add('A',     array('item3'));            // <- on item3
$deps->add('C',     array('item2', 'item1'));   // ......

print_r($deps->getResolved());
/*
Array
(
    [0] => item2
    [1] => item1
    [2] => C
)
*/

print_r($deps->getUnresolved());
/*
Array
(
    [0] => item3
    [1] => A
)
*/

http://codepad.org/fSwJjyz5

这篇关于PHP相关性类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆