2828class ReferenceList implements Comparable, Countable, IteratorAggregate, Serializable {
2929
3030 /**
31- * @var Reference[]
31+ * @var Reference[] Ordered list or references, indexed by SPL object hash.
3232 */
3333 private $ references = array ();
3434
@@ -73,7 +73,7 @@ public function addReference( Reference $reference, $index = null ) {
7373
7474 if ( $ index === null || $ index >= count ( $ this ->references ) ) {
7575 // Append object to the end of the reference list.
76- $ this ->references [] = $ reference ;
76+ $ this ->references [spl_object_hash ( $ reference ) ] = $ reference ;
7777 } else {
7878 $ this ->insertReferenceAtIndex ( $ reference , $ index );
7979 }
@@ -100,7 +100,11 @@ public function addNewReference( $snaks = array() /*...*/ ) {
100100 * @param int $index
101101 */
102102 private function insertReferenceAtIndex ( Reference $ reference , $ index ) {
103- array_splice ( $ this ->references , $ index , 0 , array ( $ reference ) );
103+ $ this ->references = array_merge (
104+ array_slice ( $ this ->references , 0 , $ index ),
105+ array ( spl_object_hash ( $ reference ) => $ reference ),
106+ array_slice ( $ this ->references , $ index )
107+ );
104108 }
105109
106110 /**
@@ -126,10 +130,14 @@ public function hasReference( Reference $reference ) {
126130 * @return int|bool
127131 */
128132 public function indexOf ( Reference $ reference ) {
129- foreach ( $ this ->references as $ index => $ ref ) {
133+ $ index = 0 ;
134+
135+ foreach ( $ this ->references as $ ref ) {
130136 if ( $ ref === $ reference ) {
131137 return $ index ;
132138 }
139+
140+ $ index ++;
133141 }
134142
135143 return false ;
@@ -174,13 +182,11 @@ public function removeReferenceHash( $referenceHash ) {
174182 return ;
175183 }
176184
177- foreach ( $ this ->references as $ index => $ ref ) {
185+ foreach ( $ this ->references as $ splObjectHash => $ ref ) {
178186 if ( $ ref === $ reference ) {
179- unset( $ this ->references [$ index ] );
187+ unset( $ this ->references [$ splObjectHash ] );
180188 }
181189 }
182-
183- $ this ->references = array_values ( $ this ->references );
184190 }
185191
186192 /**
@@ -211,7 +217,7 @@ public function getReference( $referenceHash ) {
211217 * @return string
212218 */
213219 public function serialize () {
214- return serialize ( $ this ->references );
220+ return serialize ( array_values ( $ this ->references ) );
215221 }
216222
217223 /**
@@ -222,7 +228,7 @@ public function serialize() {
222228 * @param string $serialized
223229 */
224230 public function unserialize ( $ serialized ) {
225- $ this ->references = unserialize ( $ serialized );
231+ $ this ->__construct ( unserialize ( $ serialized ) );
226232 }
227233
228234 /**
@@ -283,7 +289,7 @@ public function count() {
283289 * @return Traversable
284290 */
285291 public function getIterator () {
286- return new ArrayIterator ( $ this ->references );
292+ return new ArrayIterator ( array_values ( $ this ->references ) );
287293 }
288294
289295}
0 commit comments