123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- <?php
- class ElggPriorityList
- implements \Iterator, \Countable {
-
- private $elements = array();
-
- public function __construct(array $elements = array()) {
- if ($elements) {
- foreach ($elements as $priority => $element) {
- $this->add($element, $priority);
- }
- }
- }
-
- public function add($element, $priority = null, $exact = false) {
- if ($priority !== null && !is_numeric($priority)) {
- return false;
- } else {
- $priority = $this->getNextPriority($priority);
- }
- $this->elements[$priority] = $element;
- $this->sorted = false;
- return $priority;
- }
-
- public function remove($element, $strict = false) {
- $index = array_search($element, $this->elements, $strict);
- if ($index !== false) {
- unset($this->elements[$index]);
- return true;
- } else {
- return false;
- }
- }
-
- public function move($element, $new_priority, $strict = false) {
- $new_priority = (int) $new_priority;
-
- $current_priority = $this->getPriority($element, $strict);
- if ($current_priority === false) {
- return false;
- }
- if ($current_priority == $new_priority) {
- return true;
- }
-
- $element = $this->getElement($current_priority);
- unset($this->elements[$current_priority]);
- return $this->add($element, $new_priority);
- }
-
- public function getElements() {
- $this->sortIfUnsorted();
- return $this->elements;
- }
-
- public function sort($callback = null) {
- if (!$callback) {
- ksort($this->elements, SORT_NUMERIC);
- } else {
- $sorted = call_user_func($callback, $this->elements);
- if (!$sorted) {
- return false;
- }
- $this->elements = $sorted;
- }
-
- $this->sorted = true;
- return true;
- }
-
- private function sortIfUnsorted() {
- if (!$this->sorted) {
- return $this->sort();
- }
- }
-
- public function getNextPriority($near = 0) {
- $near = (int) $near;
-
- while (array_key_exists($near, $this->elements)) {
- $near++;
- }
- return $near;
- }
-
- public function getPriority($element, $strict = false) {
- return array_search($element, $this->elements, $strict);
- }
-
- public function getElement($priority) {
- return (isset($this->elements[$priority])) ? $this->elements[$priority] : false;
- }
-
- public function contains($element, $strict = false) {
- return $this->getPriority($element, $strict) !== false;
- }
-
-
-
-
- public function rewind() {
- $this->sortIfUnsorted();
- return reset($this->elements);
- }
-
- public function current() {
- $this->sortIfUnsorted();
- return current($this->elements);
- }
-
- public function key() {
- $this->sortIfUnsorted();
- return key($this->elements);
- }
-
- public function next() {
- $this->sortIfUnsorted();
- return next($this->elements);
- }
-
- public function valid() {
- $this->sortIfUnsorted();
- $key = key($this->elements);
- return ($key !== null && $key !== false);
- }
-
- public function count() {
- return count($this->elements);
- }
- }
|