From 7d22f1cd70189d7b13d1cc30b846f9086abfc545 Mon Sep 17 00:00:00 2001 From: Andrey Kutejko Date: Sun, 9 Nov 2014 10:28:31 +0200 Subject: [PATCH] topological sort algorithm --- src/algorithm.php | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/algorithm.php diff --git a/src/algorithm.php b/src/algorithm.php new file mode 100644 index 0000000..9873e67 --- /dev/null +++ b/src/algorithm.php @@ -0,0 +1,56 @@ +following, $obj); + } + + private function once($obj) + { + if (in_array($obj, $this->visited)) { + return false; + } else { + $this->visited[] = $obj; + return true; + } + } + + private function visit($obj, $chain) + { + if (in_array($obj, $chain)) { + $chain[] = $obj; + return $chain; + } + + if ($this->once($obj)) { + $chain[] = $obj; + foreach ($this->getFollowing($obj) as $following) { + $loop = $this->visit($following, $chain); + if ($loop !== false) + return $loop; + } + $this->result[] = $obj; + } + return false; + } + + public static function sort($initialNodes, $following) + { + $sort = new self; + $sort->following = $following; + + foreach ($initialNodes as $start) { + $loop = $sort->visit($start, array()); + if ($loop !== false) + return array(false, $loop); + } + return array(true, $sort->result); + } +} + -- 2.49.0