PHP拓扑排序 列表:控制器名称=>优先级:必需的控制器

PHP拓扑排序 列表:控制器名称=>优先级:必需的控制器,php,algorithm,sorting,Php,Algorithm,Sorting,已排序和预期输出: controller_2 controller_1 controller_4 controller_3 第一种是按优先级排序, 然后根据之前要加载的所需控制器重新排序。 确保不因控制器相互要求而陷入无限循环 我想我需要这样的东西: function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } uasort($controllers

已排序和预期输出:

controller_2
controller_1
controller_4
controller_3
第一种是按优先级排序, 然后根据之前要加载的所需控制器重新排序。 确保不因控制器相互要求而陷入无限循环

我想我需要这样的东西:

function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

uasort($controllers_array, 'cmp');
请通过以下步骤帮助解决此问题:

移除无限循环控制器ex:controller\u loopexit1和controller\u loopexit2 删除与不存在的控制器具有依赖关系的控制器,例如:依赖于控制器的控制器不存在。 按优先级编号对剩余项目进行排序,最低优先 第二种按依赖项排序 代码: 输出:

Message: Dependency `controller_not_exists` not found, required by `controller_x`
Message: Circular dependency found: controller_loopexit1->controller_loopexit2->controller_loopexit1
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_not_exists
    [4] => controller_x
    [5] => controller_3
)
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_3
)
案例2 输入添加缺少的依赖项,您仍然具有循环依赖项/无限循环:

$controllersList =  array(
    "controller_3" => "3",
    "controller_1" => "1:controller_2",
    "controller_2" => "2",
    "controller_4" => "1:controller_2&controller_1",
    "controller_x" => "2:controller_not_exists",
    "controller_loopexit1" => "4:controller_loopexit2",
    "controller_loopexit2" => "5:controller_loopexit1",
    "controller_not_exists" => "10:controller_2",
);
输出:

Message: Dependency `controller_not_exists` not found, required by `controller_x`
Message: Circular dependency found: controller_loopexit1->controller_loopexit2->controller_loopexit1
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_not_exists
    [4] => controller_x
    [5] => controller_3
)
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_3
)
案例3 输入删除了具有循环依赖关系的控制器:

$controllersList =  array(
    "controller_3" => "3",
    "controller_1" => "1:controller_2",
    "controller_2" => "2",
    "controller_4" => "1:controller_2&controller_1",
    "controller_x" => "2:controller_not_exists",
    "controller_loopexit1" => "4:controller_loopexit2",
    "controller_loopexit2" => "5:controller_loopexit1"
);
$controllersList =  array(
    "controller_3" => "3",
    "controller_1" => "1:controller_2",
    "controller_2" => "2",
    "controller_4" => "1:controller_2&controller_1",
    "controller_x" => "2:controller_not_exists",
    "controller_not_exists" => "10:controller_2",
);
输出:

Message: Dependency `controller_not_exists` not found, required by `controller_x`
Message: Circular dependency found: controller_loopexit1->controller_loopexit2->controller_loopexit1
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_not_exists
    [4] => controller_x
    [5] => controller_3
)
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_3
)
案例4 输入已删除控制器\u不存在且控制器\u x:

输出:

Message: Dependency `controller_not_exists` not found, required by `controller_x`
Message: Circular dependency found: controller_loopexit1->controller_loopexit2->controller_loopexit1
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_not_exists
    [4] => controller_x
    [5] => controller_3
)
Array
(
    [0] => controller_2
    [1] => controller_1
    [2] => controller_4
    [3] => controller_3
)

您的输入包含7项,您的输出只有4项?优先级是如何定义的?是的,这是正确的,如果不满足所需的控制器,则删除该项。您需要的是拓扑排序。我在这里回答了一个类似的关于依赖关系的问题,这应该让您开始学习。最后,您需要添加的唯一附加内容是按优先级排序。也应该有帮助。这里有两个独立的问题:1删除周期2排序。你不应该在同一个问题中混用两个问题。