我需要一个队列,在这个队列中我添加对象(先进先出)。
此外,我还跟踪hashmap中没有重复的对象。

<?php

$test = new \SplQueue();
$done = array();

// Put 'test a' in queue
$test->enqueue('test a');

// While we have objects in the queue...
while ($test->valid()) {
    // Echo the current object
    $current = $test->current();
    echo $current, PHP_EOL;

    // Remove the current object and add it to "done"
    $test->dequeue();
    $done[$current] = 1;

    // Add more to queue
    $new = array('test a', 'test b', 'test c');
    foreach ($new as $newObject) {
        if (! isset($done[$newObject])) {
            $test->enqueue($newObject);
        }
    }
}

在php代码板中,我没有得到任何结果。
怎么了?
更新:一段时间后,我得到输出:
test a
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /code/NIPg42 on line 25
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /code/NIPg42 on line 25

我对已经完成的对象进行出列和测试,为什么这是一个无限循环?
第25行$test->enqueue($newObject);

最佳答案

对我来说,使用splqueue更容易(也更自然),只需使用两种基本方法:enqueue将一个项放在队列的末尾,dequeue提取您必须从队列的开头处理的项。这意味着去掉current,而使用dequeue的结果:

$current = $test->dequeue();
$done[$current] = 1;
var_dump($current); // or any other processing

如果试图将空列表出列会导致错误,则必须先检查它。所以你的代码变得类似于:
$test = new \SplQueue();
$done = array();

// Put 'test a' in queue
$test->enqueue('test a');

// While we have objects in the queue...
while (!$test->isEmpty()) {
    $item = $test->dequeue();
    $done[$item] = 1;
    var_dump($item);

    // Add more to queue
    $new = array('test a', 'test b', 'test c');
    foreach ($new as $newObject) {
        if (! isset($done[$newObject])) {
            $test->enqueue($newObject);

// without this line, `test c` will be enqueued twice.
            $done[$newObject] = 1;
        }
    }
}

Demo。如您所见,这里还有另一个更改:在执行enqueue之前设置散列。如果您确实想创建一个hashqueue(某种类型),我建议您创建自己的类(扩展或使用splqueue);该键将伴随每个enqueue操作以及对hash的相应检查/添加。

09-27 18:12