Chris@0
|
1 <?php
|
Chris@0
|
2 /**
|
Chris@0
|
3 * Zend Framework (http://framework.zend.com/)
|
Chris@0
|
4 *
|
Chris@0
|
5 * @link http://github.com/zendframework/zf2 for the canonical source repository
|
Chris@0
|
6 * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
|
Chris@0
|
7 * @license http://framework.zend.com/license/new-bsd New BSD License
|
Chris@0
|
8 */
|
Chris@0
|
9
|
Chris@0
|
10 namespace Zend\Stdlib;
|
Chris@0
|
11
|
Chris@0
|
12 use Serializable;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * Serializable version of SplPriorityQueue
|
Chris@0
|
16 *
|
Chris@0
|
17 * Also, provides predictable heap order for datums added with the same priority
|
Chris@0
|
18 * (i.e., they will be emitted in the same order they are enqueued).
|
Chris@0
|
19 */
|
Chris@0
|
20 class SplPriorityQueue extends \SplPriorityQueue implements Serializable
|
Chris@0
|
21 {
|
Chris@0
|
22 /**
|
Chris@0
|
23 * @var int Seed used to ensure queue order for items of the same priority
|
Chris@0
|
24 */
|
Chris@0
|
25 protected $serial = PHP_INT_MAX;
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * Insert a value with a given priority
|
Chris@0
|
29 *
|
Chris@0
|
30 * Utilizes {@var $serial} to ensure that values of equal priority are
|
Chris@0
|
31 * emitted in the same order in which they are inserted.
|
Chris@0
|
32 *
|
Chris@0
|
33 * @param mixed $datum
|
Chris@0
|
34 * @param mixed $priority
|
Chris@0
|
35 * @return void
|
Chris@0
|
36 */
|
Chris@0
|
37 public function insert($datum, $priority)
|
Chris@0
|
38 {
|
Chris@12
|
39 if (! is_array($priority)) {
|
Chris@0
|
40 $priority = [$priority, $this->serial--];
|
Chris@0
|
41 }
|
Chris@0
|
42 parent::insert($datum, $priority);
|
Chris@0
|
43 }
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * Serialize to an array
|
Chris@0
|
47 *
|
Chris@0
|
48 * Array will be priority => data pairs
|
Chris@0
|
49 *
|
Chris@0
|
50 * @return array
|
Chris@0
|
51 */
|
Chris@0
|
52 public function toArray()
|
Chris@0
|
53 {
|
Chris@0
|
54 $array = [];
|
Chris@0
|
55 foreach (clone $this as $item) {
|
Chris@0
|
56 $array[] = $item;
|
Chris@0
|
57 }
|
Chris@0
|
58 return $array;
|
Chris@0
|
59 }
|
Chris@0
|
60
|
Chris@0
|
61 /**
|
Chris@0
|
62 * Serialize
|
Chris@0
|
63 *
|
Chris@0
|
64 * @return string
|
Chris@0
|
65 */
|
Chris@0
|
66 public function serialize()
|
Chris@0
|
67 {
|
Chris@0
|
68 $clone = clone $this;
|
Chris@0
|
69 $clone->setExtractFlags(self::EXTR_BOTH);
|
Chris@0
|
70
|
Chris@0
|
71 $data = [];
|
Chris@0
|
72 foreach ($clone as $item) {
|
Chris@0
|
73 $data[] = $item;
|
Chris@0
|
74 }
|
Chris@0
|
75
|
Chris@0
|
76 return serialize($data);
|
Chris@0
|
77 }
|
Chris@0
|
78
|
Chris@0
|
79 /**
|
Chris@0
|
80 * Deserialize
|
Chris@0
|
81 *
|
Chris@0
|
82 * @param string $data
|
Chris@0
|
83 * @return void
|
Chris@0
|
84 */
|
Chris@0
|
85 public function unserialize($data)
|
Chris@0
|
86 {
|
Chris@17
|
87 $this->serial = PHP_INT_MAX;
|
Chris@0
|
88 foreach (unserialize($data) as $item) {
|
Chris@17
|
89 $this->serial--;
|
Chris@0
|
90 $this->insert($item['data'], $item['priority']);
|
Chris@0
|
91 }
|
Chris@0
|
92 }
|
Chris@0
|
93 }
|