Edit report at https://bugs.php.net/bug.php?id=53710&edit=1
ID: 53710 Updated by: col...@php.net Reported by: weierophin...@php.net Summary: Data registered with equal priority not returned in expected order -Status: Assigned +Status: Wont fix Type: Bug Package: SPL related Operating System: Linux 32-bit PHP Version: 5.3.5 Assigned To: colder Block user comment: N Private report: N New Comment: There is no such guarantee. The only guarantee that you'll get from SplPriorityQueue is that you won't get an element out of order. Elements with the same priority are extracted in arbitrary order, the rest is implementation dependant. Previous Comments: ------------------------------------------------------------------------ [2011-01-17 19:44:44] daniel at berste dot in Reproduced on OSX (PHP compiled from MacPorts): $ php --version PHP 5.3.5 (cli) (built: Jan 9 2011 20:15:19) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans $ cat test.php <?php $queue = new SplPriorityQueue(); $queue->insert('foo', 100); $queue->insert('bar', 100); $queue->insert('baz', 100); $queue->insert('bat', 100); foreach ($queue as $data) { echo $data, "\n"; } $ php test.php foo bat baz bar ------------------------------------------------------------------------ [2011-01-10 22:23:46] weierophin...@php.net Description: ------------ SplPriorityQueue does not behave as expected when data is registered with equal priority. One would expect one of the following situations: * The data retain the same order as how they were registered * The data are ordered based on value Neither of these are the case, however. From empirical analysis, it appears that the following happens: * The first item registered at that priority will always be the first returned * The remaining items are returned in the reverse order in which they were enqueued. Test script: --------------- $queue = new SplPriorityQueue(); $queue->insert('foo', 100); $queue->insert('bar', 100); $queue->insert('baz', 100); $queue->insert('bat', 100); foreach ($queue as $data) { echo $data, "\n"; } Expected result: ---------------- // IDEALLY order in which they are registered: foo bar baz bat // OR following same rules as priority queue -- higher values == higher priority foo baz bat bar Actual result: -------------- foo bat baz bar ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=53710&edit=1