Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP依赖类_Php_Arrays_Multidimensional Array_Dependencies_Sorting - Fatal编程技术网

PHP依赖类

PHP依赖类,php,arrays,multidimensional-array,dependencies,sorting,Php,Arrays,Multidimensional Array,Dependencies,Sorting,我用的是这个问题中的依赖类,特别是Paul Norman的版本,它工作得几乎完美,但我发现顺序并不总是正确的 你可以在这里检查代码 结果是错误的,应该是错误的 Loaded: Array ( [0] => menus [1] => settings [2] => countries [3] => dashboard [4] => languages [5] => modules [6] => users ) Failed: Array (

我用的是这个问题中的依赖类,特别是Paul Norman的版本,它工作得几乎完美,但我发现顺序并不总是正确的

你可以在这里检查代码

结果是错误的,应该是错误的

Loaded: Array ( [0] => menus [1] => settings [2] => countries [3] => dashboard [4] => languages [5] => modules [6] => users ) Failed: Array ( ) 已加载:数组 ( [0]=>菜单 [1] =>设置 [2] =>国家 [3] =>仪表板 [4] =>语言 [5] =>模块 [6] =>用户 ) 失败:数组 ( ) 你知道怎么修吗


谢谢

关于保罗·诺曼的解决方案,我不知道该告诉你什么,但似乎有一个bug。。。我尝试了一个解决方案,它似乎满足了示例中的依赖性(尽管没有按照您想要的顺序列出它们…)

类依赖关系
{
私人物品;;
私人的美元视情况而定;
私人依赖;
公共函数构造()
{
$this->items=array();
$this->dependens=array();
$this->hasDependency=array();
}
公共函数add($item,$dependsOn=array())
{
$this->items[]=$item;
foreach($dependsOn作为$dependsOnItem)
{
$this->items[]=$dependsOnItem;
$this->depends[$dependsOnItem][]=$item;
}
$this->items=array\u unique($this->items);
$this->hasDependency[$item]=$dependsOn;
}
公共函数getLoadOrder()
{
$order=array();
$hasChanged=true;
while(count($order)items)&&&$hasChanged==true)
{
$hasChanged=false;
foreach($this->hasDependency as$item=>$dependencies)
{
如果($this->successed($item,$order))
{
$order[]=$item;
未设置($this->hasDependency[$item]);
$hasChanged=true;
}
}
}
if(count($order)items)&&$hasChanged==false)
{
呼应“不可能的依赖集”;
返回false;
}
退回$order;
}
满足专用功能($item,$addedSoFar)
{
$dependencies=$this->hasDependency[$item];
foreach($dependencies作为$dependency)
{
if(!in_数组($dependency,$addedSoFar))
{
返回false;
}
}
返回true;
}
}
$deps=新的依赖项();
$deps->添加('countries',数组('menu','settings');
$deps->add('dashboard',array('menu');
$deps->add('languages',array('menu','settings');
$deps->add('菜单');
$deps->add('modules',array('menu');
$deps->add('settings',array('menu');
$deps->add('users',array('menu'));
打印($deps->getLoadOrder());

您自己做过研究吗?我尝试过对它们进行分类,但它们并没有按需要进行分类。我尝试了对数组$u依赖项进行排序,但也没有成功,我也尝试了搜索PHP拓扑排序函数/类,它找到的第一个结果对于使用imo来说非常混乱。感谢它的工作,但我有一个小问题,我删除了我的另外两条注释,只是为了不让任何人感到困惑。。我更改了add函数的工作方式,并尝试检索无法排序的项,因为缺少依赖项,但它不能正常工作。传递的项是可以的,但方法是正确的。crm项从未添加到失败的数组=\n很抱歉延迟,但我不清楚您所说的“无法排序的项”是什么意思。我的理解是,你只想确保你在找到依赖它们的项目之前找到所有依赖的项目。如果依赖项中没有周期,那么它们都不会失败。no problem=),我成功地获得了我需要的工作,没有使用此类思想,但在安装应用程序时我将使用此类。问题是,我有一个模块化系统,每个模块都有依赖项和从属项。。因此,当系统安装后,我可以管理模块,如安装、卸载、启用和禁用模块。。。需要做的事情是,我需要检查我是否可以安装一个具有依赖性的模块,我在我的模块类中实现了一些函数来执行所需的检查,结果是preety nice=),但是感谢您的class=DGlad,它很有帮助!干得好。听起来是一个相当复杂的系统。
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());