PHP: Hypertext Preprocessor (original) (raw)

The SplQueue class

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Introduction

The SplQueue class provides the main functionalities of a queue implemented using a doubly linked list by setting the iterator mode to [SplDoublyLinkedList::IT_MODE_FIFO](class.spldoublylinkedlist.php#spldoublylinkedlist.constants.it-mode-fifo).

Class synopsis

Examples

Example #1 SplQueue example

<?php $q = new SplQueue(); $q[] = 1; $q[] = 2; $q[] = 3; foreach ($q as $elem) { echo $elem."\n"; } ?>

The above example will output:

Example #2 Efficiently handling tasks with SplQueue

<?php $q = new SplQueue(); $q->setIteratorMode(SplQueue::IT_MODE_DELETE); // ... enqueue some tasks on the queue ... // process them foreach ($q as $task) { // ... process $task ... // add new tasks on the queue <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi><mo stretchy="false">[</mo><mo stretchy="false">]</mo><mo>=</mo></mrow><annotation encoding="application/x-tex">q[] = </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span><span class="mopen">[</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span></span></span></span>newTask; // ... } ?>

Table of Contents

Found A Problem?

Manu Manjunath

11 years ago

`SplQueue inherits from SplDoublyLinkedList. So, objects of SplQueue support methods push() and pop(). But please be advised that if you use push() and pop() methods on a SplQueue object, it behaves like a stack rather than a queue.

For example:

$q = new SplQueue();
$q->push(1);
$q->push(2);
$q->push(3);
$q->pop();
print_r($q);

Above code returns:

SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => 1
[1] => 2
)
)

Note that 3 got popped and not 1.

So, please make sure that you use only enqueue() and dequeue() methods on a SplQueue object and not push() and pop().

`

MrStonedOne

10 years ago

`You can use shift/unshift and push/pop to dequeue/undequeue and queue/unqueue respectively. Really handy for those applications that use sockets where you might not know you can't send data until you attempt to.

for example, this is a function for an application that will un-dequeue the remainder of the data if socket_write indicated it did not write the entire contents of the provided data.

isEmpty()) { //shift() is the same as dequeue() senditem=senditem = senditem=sendQueue->shift();//returns the number of bytes written. rtn=socketwrite(rtn = socket_write(rtn=socketwrite(socket, $senditem); if ($rtn === false) { sendQueue−>unshift(sendQueue->unshift(sendQueue>unshift(senditem); throw new exception("send error: " . socket_last_error($socket)); return; } if ($rtn < strlen($senditem) { sendQueue−>unshift(substr(sendQueue->unshift(substr(sendQueue>unshift(substr(senditem, $rtn); break; } } } ?>

`

lincoln dot du dot j at gmail dot com

7 years ago

`<?php

$queue

= new SplQueue();
$queue->enqueue('A');
$queue->enqueue('B'); queue−>enqueue(′C′);queue->enqueue('C');queue>enqueue(C);queue->rewind();
while($queue->valid()){
echo $queue->current(),"\n";
$queue->next();
}print_r($queue);
$queue->dequeue(); //remove first one
print_r($queue);?>
Output

A
B
C
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => A
[1] => B
[2] => C
)

)
SplQueue Object
(
[flags:SplDoublyLinkedList:private] => 4
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => B
[1] => C
)

)

`

booleantype at ya dot ru

4 years ago

`Answer to Manu Manjunath post (#114336).

IMO, pop() works as expected.

There are 2 main groups of methods:

  1. pop() & push() are inherited from SplDoublyLinkedList and can be applied to SplStack as well as SplQueue (ie are "faceless"). It isn't about stack or queue; it's just about deleting / adding element to the end of the list;

  2. the same situation with shift() & unshift(): it is just about adding an element to the beginning of the list, and doesn't matter, if we use it on SplStack or SplQueue.

So, yes, q−>pop();willremove∗last∗elementfromSplQueueq->pop(); will remove last element from SplQueue q>pop();willremovelastelementfromSplQueueq.

But enqueue() & dequeue() are about SplQueue. FIFO principle is realized by these methods, which were implemented exactly for queue purpose:

If you want to delete next in line element from queue, use dequeue().
If you want to delete last element from the list (doesn't matter, if it's queue or stack), use pop().

`

Stingus

8 years ago

`Take care that SplQueue::valid() is not returning true if the queue has nodes. Use isEmpty() instead:

$queue = new SplQueue();
$queue->enqueue('A');
$queue->enqueue('B');
$queue->enqueue('C');
var_dump($queue->valid()); // false
var_dump(!$queue->isEmpty()); // true

`

mostefa dot medjahed dot pro at gmail dot com

4 years ago

`As was said before, the push () and pop () methods on a SplQueue object, its behave like a stack rather than a queue.

Knowing that the enqueue () and dequeue () methods are respectively aliases of push () and shift () methods, we can also use SplQueue :: push () and SplQueue :: shift () for the same purpose as SplQueue :: enqueue and SplQueue :: dequeue.

`