В интересах любого, кто найдет эту тему в поиске
(1)
$pkgList = array();
$result = mysqli_query($conn, 'SELECT * FROM `Packages`');
while (($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) != NULL) {
$pkgList[] = $row['idPackages'];
}
$reqEdgeList = array();
$conEdgeList = array();
$result = mysqli_query($conn, "SELECT * FROM `Dependancies` WHERE `Relationship` = 'Requires'");
while (($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) != NULL) {
switch ($row['Relationship']) {
case 'Requires':
$reqEdgeList[] = array($row["DependerPackage"], $row["DependeePackage"]);
break;
case 'Conflicts':
$conEdgeList[] = array($row["DependerPackage"], $row["DependeePackage"]);
break;
}
}
(2) и (3)
В итоге я использовал алгоритм здесь .В основном, удаляя конечные узлы, вы либо оставляете (набор) циклов, либо пустой график.
$allReqs = $reqEdgeList;
$noDependanciesCycle = true;
$searching = true;
while ($searching) {
if (empty($pkgList)) {
$searching = false;
echo "Req is a DAG\n<br />";
} else {
$foundleaf = false;
$leaf = null;
foreach ($pkgList as $key => $l) {
$isLeaf = true;
foreach ($reqEdgeList as $k => $edge) {
if ($edge[0] == $l) {
$isLeaf = false;
}
}
if ($isLeaf) {
$foundleaf = true;
$leaf = $l;
}
}
if ($foundleaf) {
$pkgList = array_diff($pkgList, array($leaf));
foreach ($reqEdgeList as $key => $value) {
if ($value[1] == $leaf) {
unset($reqEdgeList[$key]);
}
}
$reqEdgeList = array_values($reqEdgeList);
} else {
$searching = false;
echo "Req cycle detected\n<br />";
$noDependanciesCycle = false;
print_r($reqEdgeList);
echo "<br />\n";
}
}
}
(4)
Длядля поиска A требуется B, требуется C, но A конфликтует с C, я использовал поиск в глубину для каждого конфликта, начиная с A, в поисках C (конфликт).обзор в комментариях к этому ответу