Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

PriorityList.php

Zuletzt modifiziert: 09.10.2024, 12:55 - Dateigröße: 5.18 KiB


 001  <?php
 002  /**
 003   * Zend Framework (http://framework.zend.com/)
 004   *
 005   * @link      http://github.com/zendframework/zf2 for the canonical source repository
 006   * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
 007   * @license   http://framework.zend.com/license/new-bsd New BSD License
 008   */
 009   
 010  namespace Zend\Stdlib;
 011   
 012  use Countable;
 013  use Iterator;
 014   
 015  class PriorityList implements Iterator, Countable
 016  {
 017      const EXTR_DATA     = 0x00000001;
 018      const EXTR_PRIORITY = 0x00000002;
 019      const EXTR_BOTH     = 0x00000003;
 020      /**
 021       * Internal list of all items.
 022       *
 023       * @var array[]
 024       */
 025      protected $items = array();
 026   
 027      /**
 028       * Serial assigned to items to preserve LIFO.
 029       *
 030       * @var int
 031       */
 032      protected $serial = 0;
 033   
 034      /**
 035       * Serial order mode
 036       * @var integer
 037       */
 038      protected $isLIFO = 1;
 039   
 040      /**
 041       * Internal counter to avoid usage of count().
 042       *
 043       * @var int
 044       */
 045      protected $count = 0;
 046   
 047      /**
 048       * Whether the list was already sorted.
 049       *
 050       * @var bool
 051       */
 052      protected $sorted = false;
 053   
 054      /**
 055       * Insert a new item.
 056       *
 057       * @param  string  $name
 058       * @param  mixed   $value
 059       * @param  int     $priority
 060       *
 061       * @return void
 062       */
 063      public function insert($name, $value, $priority = 0)
 064      {
 065          $this->sorted = false;
 066          $this->count++;
 067   
 068          $this->items[$name] = array(
 069              'data'     => $value,
 070              'priority' => (int) $priority,
 071              'serial'   => $this->serial++,
 072          );
 073      }
 074   
 075      /**
 076       * @param string $name
 077       * @param int    $priority
 078       *
 079       * @return $this
 080       *
 081       * @throws \Exception
 082       */
 083      public function setPriority($name, $priority)
 084      {
 085          if (!isset($this->items[$name])) {
 086              throw new \Exception("item $name not found");
 087          }
 088   
 089          $this->items[$name]['priority'] = (int) $priority;
 090          $this->sorted                   = false;
 091   
 092          return $this;
 093      }
 094   
 095      /**
 096       * Remove a item.
 097       *
 098       * @param  string $name
 099       * @return void
 100       */
 101      public function remove($name)
 102      {
 103          if (isset($this->items[$name])) {
 104              $this->count--;
 105          }
 106   
 107          unset($this->items[$name]);
 108      }
 109   
 110      /**
 111       * Remove all items.
 112       *
 113       * @return void
 114       */
 115      public function clear()
 116      {
 117          $this->items  = array();
 118          $this->serial = 0;
 119          $this->count  = 0;
 120          $this->sorted = false;
 121      }
 122   
 123      /**
 124       * Get a item.
 125       *
 126       * @param  string $name
 127       * @return mixed
 128       */
 129      public function get($name)
 130      {
 131          if (!isset($this->items[$name])) {
 132              return;
 133          }
 134   
 135          return $this->items[$name]['data'];
 136      }
 137   
 138      /**
 139       * Sort all items.
 140       *
 141       * @return void
 142       */
 143      protected function sort()
 144      {
 145          if (!$this->sorted) {
 146              uasort($this->items, array($this, 'compare'));
 147              $this->sorted = true;
 148          }
 149      }
 150   
 151      /**
 152       * Compare the priority of two items.
 153       *
 154       * @param  array $item1,
 155       * @param  array $item2
 156       * @return int
 157       */
 158      protected function compare(array $item1, array $item2)
 159      {
 160          return ($item1['priority'] === $item2['priority'])
 161              ? ($item1['serial']   > $item2['serial']   ? -1 : 1) * $this->isLIFO
 162              : ($item1['priority'] > $item2['priority'] ? -1 : 1);
 163      }
 164   
 165      /**
 166       * Get/Set serial order mode
 167       *
 168       * @param bool|null $flag
 169       *
 170       * @return bool
 171       */
 172      public function isLIFO($flag = null)
 173      {
 174          if ($flag !== null) {
 175              $isLifo = $flag === true ? 1 : -1;
 176   
 177              if ($isLifo !== $this->isLIFO) {
 178                  $this->isLIFO = $isLifo;
 179                  $this->sorted = false;
 180              }
 181          }
 182   
 183          return 1 === $this->isLIFO;
 184      }
 185   
 186      /**
 187       * {@inheritDoc}
 188       */
 189      public function rewind()
 190      {
 191          $this->sort();
 192          reset($this->items);
 193      }
 194   
 195      /**
 196       * {@inheritDoc}
 197       */
 198      public function current()
 199      {
 200          $this->sorted || $this->sort();
 201          $node = current($this->items);
 202   
 203          return $node ? $node['data'] : false;
 204      }
 205   
 206      /**
 207       * {@inheritDoc}
 208       */
 209      public function key()
 210      {
 211          $this->sorted || $this->sort();
 212          return key($this->items);
 213      }
 214   
 215      /**
 216       * {@inheritDoc}
 217       */
 218      public function next()
 219      {
 220          $node = next($this->items);
 221   
 222          return $node ? $node['data'] : false;
 223      }
 224   
 225      /**
 226       * {@inheritDoc}
 227       */
 228      public function valid()
 229      {
 230          return current($this->items) !== false;
 231      }
 232   
 233      /**
 234       * @return self
 235       */
 236      public function getIterator()
 237      {
 238          return clone $this;
 239      }
 240   
 241      /**
 242       * {@inheritDoc}
 243       */
 244      public function count()
 245      {
 246          return $this->count;
 247      }
 248   
 249      /**
 250       * Return list as array
 251       *
 252       * @param int $flag
 253       *
 254       * @return array
 255       */
 256      public function toArray($flag = self::EXTR_DATA)
 257      {
 258          $this->sort();
 259   
 260          if ($flag == self::EXTR_BOTH) {
 261              return $this->items;
 262          }
 263   
 264          return array_map(
 265              function ($item) use ($flag) {
 266                  return ($flag == PriorityList::EXTR_PRIORITY) ? $item['priority'] : $item['data'];
 267              },
 268              $this->items
 269          );
 270      }
 271  }
 272